Release 960506

Mon May  6 12:56:26 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [DEVELOPERS-HINTS]
	Added paragraph on naming conventions for Win16/Win32/Winelib.

	* [controls/menu.c]
	Create a default system menu that is the same for all windows
	instead of making a copy every time.

	* [include/wintypes.h]
	Added WINELIB_NAME and DECL_WINELIB_TYPE macros.
	Added xx16 and xx32 definitions for most types. General clean-up.

	* [memory/global.c] [memory/local.c] [*/*]
	Renamed Global and Local heap functions to xxx16. Added all xxx32
	versions of the same functions.

	* [memory/selector.c]
	Mask out lower bits of selector in FreeSelector().

	* [misc/lstr.c]
	Fixed wvsprintf().

	* [windows/class.c]
	Changed the class structure to make Win32 support easier.

	* [windows/defwnd.c]
	Added handling of WM_INITMENUPOPUP for system menu to gray out
	invalid options.

	* [windows/winpos.c]
	Bug fix: the WINDOSPOS structure pointer in WM_NCCALCSIZE must be
	a SEGPTR.

Sun May  5 03:51:26 1996  Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>

	* [memory/local.c]
	Implementation of moveable and (rudimentary) support for
 	discardable local memory, plus several bug fixes.

Sat May  4 18:33:35 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [include/windows.h] [windows/win.c] [if1632/user.spec] 
	FindWindowEx() implemented (someone reported it was missing
	for FrameMaker 4.1).

	* [if1632/kernel32.spec] [if1632/user32.spec] [win32/memory.c]
	  [win32/resource.c]
	Misc small stubs/small functions which bring win95 binaries
	further down the road. (IsBadCodePtr, LocalReAlloc,GetCursorPos)
	Small fix in WIN32_LoadAcceleratorsA.

Fri May  3 19:43:12 1996  Frans van Dorsselaer <dorssel@rulhm1.LeidenUniv.nl>

	* [controls/edit.c] [controls/EDIT.TODO]
	Changed / fixed some types and typecasts.
	Fixed the scrollbar reset after WM_SETHANDLE / WM_SETTEXT.
	Added heap initialization in WM_CREATE.

Fri May  3 19:30:02 1996  Greg Kreider <kreider@natlab.research.philips.com>

	* [controls/combo.c] [controls/listbox.c]
	Pass WM_[HV]SCROLL to listbox, but not combo.
	Don't try to redraw non-existant scroll bars (changes dwStyle flags).
	Combo box gets border.
	Combo box includes button (otherwise button won't trigger dropdown).
	Proper border around RectButton.
	Check size consistancy of combo, listbox, and button after resizing 
	or before painting.  These routines still aren't completely correct.
	Localize size checks in separate routines.
	Listboxes are white.

Thu May  2 19:21:23 1996  Albrecht Kleine  <kleine@ak.sax.de>

	* [controls/combo.c][include/commdlg.h][include/commdlg.c]
	  [resources/sysres_De.rc][resources/sysres_En.rc]
	Introduced ChooseFont dialog, but needed some patches in 
	handling of comboboxes with edit controls.

Tue Apr 30 00:33:27 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>

	* [programs/winhelp/*]
	Added a help viewer and a simple `.hlp' to `.sgml' converter.

Mon Apr 29 14:17:57 1996  Tristan Tarrant <tst@sthinc.demon.co.uk>

	* [resources/sysres_*.rc] [misc/shell.c]
	Modified size of "About" dialog boxes.

Sat Apr 27 18:10:11 Martin von Loewis <loewis@informatik.hu-berlin.de>

	* [if1632/Makefile.in][loader/builtin.c]
	crtdll.spec, ntdll.spec, wsock32.spec: new files.

	* [loader/pe_image.c]
	Fix error message if import by ordinal failed.
diff --git a/ANNOUNCE b/ANNOUNCE
index 90ff09d..a90e0db 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,14 +1,14 @@
-This is release 960428 of Wine the MS Windows emulator.  This is still a
+This is release 960506 of Wine the MS Windows emulator.  This is still a
 developer's only release.  There are many bugs and many unimplemented API
 features.  Most applications still do not work.
 
 Patches should be submitted to "julliard@lrc.epfl.ch".  Please don't
 forget to include a ChangeLog entry.
 
-WHAT'S NEW with Wine-960428: (see ChangeLog for details)
-	- Preliminary support for VER.DLL.
-	- Suuport for Korean [Ko] language.
-	- More Win32 functions.
+WHAT'S NEW with Wine-960506: (see ChangeLog for details)
+	- Moveable and discardable blocks in local heap.
+	- Comboboxes improvements.
+	- Winhelp clone using Winelib.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -17,10 +17,10 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960428.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960428.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960428.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960428.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960506.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960506.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960506.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960506.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
@@ -30,8 +30,6 @@
 If you want to get the new releases faster, you can subscribe to the
 wine-patches mailing list by sending a mail containing 'subscribe
 wine-patches your_address' to majordomo@tiger.informatik.hu-berlin.de.
-To avoid overloading the mail host, please subscribe only if you
-really intend to test the new releases as soon as they're out.
 
 Wine is available thanks to the work of Bob Amstadt, Dag Asheim,
 Martin Ayotte, Ross Biro, Uwe Bonnes, Erik Bos, Fons Botman, John Brezak,
diff --git a/ChangeLog b/ChangeLog
index de17466..e8b06ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,102 @@
 ----------------------------------------------------------------------
+Mon May  6 12:56:26 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [DEVELOPERS-HINTS]
+	Added paragraph on naming conventions for Win16/Win32/Winelib.
+
+	* [controls/menu.c]
+	Create a default system menu that is the same for all windows
+	instead of making a copy every time.
+
+	* [include/wintypes.h]
+	Added WINELIB_NAME and DECL_WINELIB_TYPE macros.
+	Added xx16 and xx32 definitions for most types. General clean-up.
+
+	* [memory/global.c] [memory/local.c] [*/*]
+	Renamed Global and Local heap functions to xxx16. Added all xxx32
+	versions of the same functions.
+
+	* [memory/selector.c]
+	Mask out lower bits of selector in FreeSelector().
+
+	* [misc/lstr.c]
+	Fixed wvsprintf().
+
+	* [windows/class.c]
+	Changed the class structure to make Win32 support easier.
+
+	* [windows/defwnd.c]
+	Added handling of WM_INITMENUPOPUP for system menu to gray out
+	invalid options.
+
+	* [windows/winpos.c]
+	Bug fix: the WINDOSPOS structure pointer in WM_NCCALCSIZE must be
+	a SEGPTR.
+
+Sun May  5 03:51:26 1996  Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>
+
+	* [memory/local.c]
+	Implementation of moveable and (rudimentary) support for
+ 	discardable local memory, plus several bug fixes.
+
+Sat May  4 18:33:35 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [include/windows.h] [windows/win.c] [if1632/user.spec] 
+	FindWindowEx() implemented (someone reported it was missing
+	for FrameMaker 4.1).
+
+	* [if1632/kernel32.spec] [if1632/user32.spec] [win32/memory.c]
+	  [win32/resource.c]
+	Misc small stubs/small functions which bring win95 binaries
+	further down the road. (IsBadCodePtr, LocalReAlloc,GetCursorPos)
+	Small fix in WIN32_LoadAcceleratorsA.
+
+Fri May  3 19:43:12 1996  Frans van Dorsselaer <dorssel@rulhm1.LeidenUniv.nl>
+
+	* [controls/edit.c] [controls/EDIT.TODO]
+	Changed / fixed some types and typecasts.
+	Fixed the scrollbar reset after WM_SETHANDLE / WM_SETTEXT.
+	Added heap initialization in WM_CREATE.
+
+Fri May  3 19:30:02 1996  Greg Kreider <kreider@natlab.research.philips.com>
+
+	* [controls/combo.c] [controls/listbox.c]
+	Pass WM_[HV]SCROLL to listbox, but not combo.
+	Don't try to redraw non-existant scroll bars (changes dwStyle flags).
+	Combo box gets border.
+	Combo box includes button (otherwise button won't trigger dropdown).
+	Proper border around RectButton.
+	Check size consistancy of combo, listbox, and button after resizing 
+	or before painting.  These routines still aren't completely correct.
+	Localize size checks in separate routines.
+	Listboxes are white.
+
+Thu May  2 19:21:23 1996  Albrecht Kleine  <kleine@ak.sax.de>
+
+	* [controls/combo.c][include/commdlg.h][include/commdlg.c]
+	  [resources/sysres_De.rc][resources/sysres_En.rc]
+	Introduced ChooseFont dialog, but needed some patches in 
+	handling of comboboxes with edit controls.
+
+Tue Apr 30 00:33:27 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>
+
+	* [programs/winhelp/*]
+	Added a help viewer and a simple `.hlp' to `.sgml' converter.
+
+Mon Apr 29 14:17:57 1996  Tristan Tarrant <tst@sthinc.demon.co.uk>
+
+	* [resources/sysres_*.rc] [misc/shell.c]
+	Modified size of "About" dialog boxes.
+
+Sat Apr 27 18:10:11 Martin von Loewis <loewis@informatik.hu-berlin.de>
+
+	* [if1632/Makefile.in][loader/builtin.c]
+	crtdll.spec, ntdll.spec, wsock32.spec: new files.
+
+	* [loader/pe_image.c]
+	Fix error message if import by ordinal failed.
+
+----------------------------------------------------------------------
 Sun Apr 28 14:32:43 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [Makefile.in]
diff --git a/DEVELOPERS-HINTS b/DEVELOPERS-HINTS
index a661276..8025e6f 100644
--- a/DEVELOPERS-HINTS
+++ b/DEVELOPERS-HINTS
@@ -1,7 +1,8 @@
 This is intended to be a document to help new developers get started.
 Existing developers should feel free to add their comments.
 
-MEMORY AND SEGMENTS:
+MEMORY AND SEGMENTS
+===================
 
 NE (Win16) executables consist of multiple segments.  The Wine loader
 loads each segment into a unique location in the Wine processes memory
@@ -41,7 +42,59 @@
 defined as a DWORD, you'll get a compilation warning if you mistakenly
 use it as a regular 32-bit pointer.
 
-API ENTRY POINTS:
+
+NAMING CONVENTIONS FOR API FUNCTIONS AND TYPES
+==============================================
+
+In order to support both Win16 and Win32 APIs within the same source
+code, as well as share the include files between the emulator and the
+library, the following convention must be used in naming all API
+functions and types. If the Windows API uses the name 'xxx', the Wine
+code must use:
+
+ - 'xxx16' for the 16-bit version,
+ - 'xxx32' for the 32-bit version when no ASCII/Unicode strings are
+   involved,
+ - 'xxx32A' for the 32-bit version with ASCII strings,
+ - 'xxx32W' for the 32-bit version with Unicode strings.
+
+You should then use the macros WINELIB_NAME[_AW](xxx) or
+DECL_WINELIB_TYPE[_AW](xxx) (defined in include/wintypes.h) to define
+the correct 'xxx' function or type for Winelib. When compiling the
+emulator, 'xxx' is _not_ defined, meaning that you must always specify
+explicitly whether you want the 16-bit or 32-bit version.
+
+Note: if 'xxx' is the same in Win16 and Win32, you can simply use the
+same name as Windows.
+
+Examples:
+
+typedef short INT16;
+typedef int INT32;
+DECL_WINELIB_TYPE(INT);
+
+typedef struct { /* Win32 ASCII data structure */ } WNDCLASS32A;
+typedef struct { /* Win32 Unicode data structure */ } WNDCLASS32W;
+typedef struct { /* Win16 data structure */ } WNDCLASS16;
+DECL_WINELIB_TYPE_AW(WNDCLASS);
+
+ATOM RegisterClass16( WNDCLASS16 * );
+ATOM RegisterClass32A( WNDCLASS32A * );
+ATOM RegisterClass32W( WNDCLASS32W * );
+#define RegisterClass WINELIB_NAME_AW(RegisterClass)
+
+The Winelib user can then say:
+
+    INT i;
+    WNDCLASS wc = { ... };
+    RegisterClass( &wc );
+
+and this will use the correct declaration depending on the definition
+of the symbols WINELIB16, WINELIB32 and UNICODE.
+
+
+API ENTRY POINTS
+================
 
 Because Win16 programs use a 16-bit stack and because they can only
 call 16:16 addressed functions, all API entry points must be at low
@@ -57,7 +110,9 @@
 control to the proper handler.  The format of the *.spec files is
 documented in the file "tools/build-spec.txt".
 
-DEBUG MESSAGES:
+
+DEBUG MESSAGES
+==============
 
 To display a message only during debugging, you normally write something
 like this:
diff --git a/Makefile.in b/Makefile.in
index c333861..f8f6205 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -125,6 +125,9 @@
 $(ALLSUBDIRS): dummy
 	@cd $@; $(SUBMAKE)
 
+install_programs: dummy
+	@cd programs; $(SUBMAKE) install
+
 depend:
 	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) depend); done
 
diff --git a/configure b/configure
index 361565b..6967093 100755
--- a/configure
+++ b/configure
@@ -2049,6 +2049,7 @@
 objects/Makefile
 programs/Makefile
 programs/progman/Makefile
+programs/winhelp/Makefile
 rc/Makefile
 resources/Makefile
 tools/Makefile
@@ -2123,6 +2124,7 @@
 objects/Makefile
 programs/Makefile
 programs/progman/Makefile
+programs/winhelp/Makefile
 rc/Makefile
 resources/Makefile
 tools/Makefile
diff --git a/configure.in b/configure.in
index ad74c73..55a417c 100644
--- a/configure.in
+++ b/configure.in
@@ -99,6 +99,7 @@
 objects/Makefile
 programs/Makefile
 programs/progman/Makefile
+programs/winhelp/Makefile
 rc/Makefile
 resources/Makefile
 tools/Makefile
diff --git a/controls/EDIT.TODO b/controls/EDIT.TODO
index 99b4270..7bacadf 100644
--- a/controls/EDIT.TODO
+++ b/controls/EDIT.TODO
@@ -98,6 +98,8 @@
 -	The clipboard is broken.  Whenever things go wrong with
 	cut/copy/paste, it is probably the clipboard that messes up things,
 	not edit.c.
+-	Turning on WordWrap with Notepad leaves part of the horizontal
+	scrollbar visible (problem with WM_ERASEBKGND ???).
 
 
 I am still very actively changing things.  Especially I am working
diff --git a/controls/combo.c b/controls/combo.c
index 5a616ce..d2dc819 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -8,6 +8,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
@@ -32,9 +33,24 @@
   * I hope no programs rely on the implementation of combos.
   */
 
+ /*
+  * May 2nd:  I added 3 "work arounds"  (#1,#2,#3)   to make combos 
+  *           with EDIT work. (We need that for ChooseFont dialog.)
+  *           Perhaps we have to rewrite something more.
+  *           I have prepared some more stuff, but it doesn't 
+  *           contain here,  because it's not ready ;-)
+  *
+  *           If you're writing on combo.c, please mail to me.
+  *
+  *           Albrecht Kleine  <kleine@ak.sax.de>
+  */
+
 #define CBLMM_EDGE   4    /* distance inside box which is same as moving mouse
 			     outside box, to trigger scrolling of CBL */
 
+static BOOL CBCheckSize(HWND hwnd);
+static BOOL CBLCheckSize(HWND hwnd);
+
 static HBITMAP hComboBit = 0;
 static WORD CBitHeight, CBitWidth;
 
@@ -70,14 +86,17 @@
   lphc->hWndLBox = 0;
   lphc->dwState = 0;
   lphc->LastSel = -1;
-  lphc->dwStyle = style;
+  lphc->dwStyle = style; 
   lphc->DropDownVisible = FALSE;
   return TRUE;
 }
 
 void ComboUpdateWindow(HWND hwnd, LPHEADLIST lphl, LPHEADCOMBO lphc, BOOL repaint)
 {
-  SetScrollRange(lphc->hWndLBox, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
+  WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+  if (wndPtr->dwStyle & WS_VSCROLL) 
+    SetScrollRange(lphc->hWndLBox,SB_VERT,0,ListMaxFirstVisible(lphl),TRUE);
   if (repaint && lphl->bRedrawFlag) {
     InvalidateRect(hwnd, NULL, TRUE);
   }
@@ -93,7 +112,7 @@
   if (!hComboBit) COMBO_Init();
 
   createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
-  createStruct->style &= ~(WS_VSCROLL | WS_HSCROLL);
+  createStruct->style |= WS_BORDER;
   SetWindowLong(hwnd, GWL_STYLE, createStruct->style);
 
   dprintf_combo(stddeb,"ComboBox WM_NCCREATE!\n");
@@ -111,10 +130,12 @@
   LONG         style = 0;
   LONG         cstyle = GetWindowLong(hwnd,GWL_STYLE);
   RECT         rect,lboxrect;
+  WND*         wndPtr = WIN_FindWndPtr(hwnd);
   char className[] = "COMBOLBOX";  /* Hack so that class names are > 0x10000 */
   char editName[] = "EDIT";
 
   /* translate combo into listbox styles */
+  cstyle |= WS_BORDER;
   if (cstyle & CBS_OWNERDRAWFIXED) style |= LBS_OWNERDRAWFIXED;
   if (cstyle & CBS_OWNERDRAWVARIABLE) style |= LBS_OWNERDRAWVARIABLE;
   if (cstyle & CBS_SORT) style |= LBS_SORT;
@@ -122,19 +143,22 @@
   style |= LBS_NOTIFY;
   CreateListBoxStruct(hwnd, ODT_COMBOBOX, style, GetParent(hwnd));
   CreateComboStruct(hwnd,cstyle);
+
   lphl = ComboGetListHeader(hwnd);
   lphc = ComboGetStorageHeader(hwnd);
 
   GetClientRect(hwnd,&rect);
   GetWindowRect(hwnd,&lboxrect);
+
   /* FIXME: combos with edit controls are broken. */
   switch(cstyle & 3) {
    case CBS_SIMPLE:            /* edit control, list always visible  */
     dprintf_combo(stddeb,"CBS_SIMPLE\n");
     SetRectEmpty(&lphc->RectButton);
+    lboxrect=rect;                          /* work around #1 */   
     lphc->LBoxTop = lphl->StdItemHeight;
-    lphc->hWndEdit = CreateWindow(MAKE_SEGPTR(editName), (SEGPTR)0, 
-				  WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
+    lphc->hWndEdit = CreateWindow16(MAKE_SEGPTR(editName), (SEGPTR)0, 
+				  WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT | WS_BORDER,
 				  0, 0, rect.right, lphl->StdItemHeight,
 				  hwnd, (HMENU)1, WIN_GetWindowInstance(hwnd), 0L);
     break;
@@ -147,7 +171,7 @@
     SetWindowPos(hwnd, 0, 0, 0, rect.right - rect.left + 2*SYSMETRICS_CXBORDER,
 		 lphl->StdItemHeight + 2*SYSMETRICS_CYBORDER,
 		 SWP_NOMOVE | SWP_NOZORDER);
-    lphc->hWndEdit = CreateWindow(MAKE_SEGPTR(editName), (SEGPTR)0,
+    lphc->hWndEdit = CreateWindow16(MAKE_SEGPTR(editName), (SEGPTR)0,
 				  WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
 				  0, 0, lphc->RectButton.left, lphl->StdItemHeight,
 				  hwnd, (HMENU)1, WIN_GetWindowInstance(hwnd), 0L);
@@ -158,8 +182,9 @@
     lphc->RectButton.left = lphc->RectButton.right - 6 - CBitWidth;
     lphc->RectButton.bottom = lphc->RectButton.top + lphl->StdItemHeight;
     lphc->LBoxTop = lphl->StdItemHeight;
-    SetWindowPos(hwnd, 0, 0, 0, rect.right - rect.left + 2*SYSMETRICS_CXBORDER,
-		 lphl->StdItemHeight + 2*SYSMETRICS_CYBORDER,
+
+    SetWindowPos(hwnd, 0, 0, 0, rect.right, 
+		 lphl->StdItemHeight + 2*SYSMETRICS_CYBORDER, 
 		 SWP_NOMOVE | SWP_NOZORDER);
     break;
   }
@@ -167,16 +192,45 @@
   /* FIXME: WinSight says these should be CHILD windows with the TOPMOST flag
    * set. Wine doesn't support TOPMOST, and simply setting the WS_CHILD
    * flag doesn't work. */
-  lphc->hWndLBox = CreateWindow(MAKE_SEGPTR(className), (SEGPTR)0, 
-				WS_POPUP | WS_BORDER | WS_VSCROLL,
+   if ((cstyle & 3)==CBS_SIMPLE)                     /* work around #2 */
+   {
+    lphc->hWndLBox = CreateWindow16(MAKE_SEGPTR(className), (SEGPTR)0, 
+                                  WS_BORDER |  WS_CHILD | WS_VISIBLE |
+ 				((cstyle & WS_HSCROLL)? WS_HSCROLL : 0) |
+ 				((cstyle & WS_VSCROLL)? WS_VSCROLL : 0),
+				lboxrect.left +8 , lboxrect.top,
+				lboxrect.right - lboxrect.left - 8, 
+				lboxrect.bottom - lboxrect.top,
+				  hwnd,0, WIN_GetWindowInstance(hwnd),
+				(SEGPTR)hwnd );
+   }
+   else
+   {
+    lphc->hWndLBox = CreateWindow16(MAKE_SEGPTR(className), (SEGPTR)0, 
+				WS_POPUP | WS_BORDER |
+ 				((cstyle & WS_HSCROLL)? WS_HSCROLL : 0) |
+ 				((cstyle & WS_VSCROLL)? WS_VSCROLL : 0),
 				lboxrect.left, lboxrect.top,
 				lboxrect.right - lboxrect.left, 
 				lboxrect.bottom - lboxrect.top,
 				0, 0, WIN_GetWindowInstance(hwnd),
 				(SEGPTR)hwnd );
-  ShowWindow(lphc->hWndLBox, SW_HIDE);
-  dprintf_combo(stddeb,"Combo Creation LBox=%04x\n", lphc->hWndLBox);
-  return 0;
+    ShowWindow(lphc->hWndLBox, SW_HIDE);
+   }  
+   wndPtr->dwStyle &= ~(WS_VSCROLL | WS_HSCROLL);
+   
+   dprintf_combo( stddeb, "Combo Creation hwnd=%04x  LBox=%04x\n",
+                  hwnd, lphc->hWndLBox);
+   dprintf_combo( stddeb, "  lbox %d,%d-%d,%d     button %d,%d-%d,%d\n",
+                  lboxrect.left, lboxrect.top, lboxrect.right, lboxrect.bottom,
+                  lphc->RectButton.left, lphc->RectButton.top,
+                  lphc->RectButton.right, lphc->RectButton.bottom );
+   dprintf_combo( stddeb, "   client %d,%d-%d,%d     window %d,%d-%d,%d\n",
+                  wndPtr->rectClient.left, wndPtr->rectClient.top,
+                  wndPtr->rectClient.right, wndPtr->rectClient.bottom,
+                  wndPtr->rectWindow.left, wndPtr->rectWindow.top,
+                  wndPtr->rectWindow.right, wndPtr->rectWindow.bottom );
+   return 0;
 }
 
 /***********************************************************************
@@ -205,14 +259,12 @@
   HFONT  hOldFont;
   HDC  hdc;
   RECT rect;
-  int height;
   
   hdc = BeginPaint(hwnd, &ps);
-
-  if (hComboBit != 0) {
+  if (hComboBit != 0 && !IsRectEmpty(&lphc->RectButton)) {           /* work around #3 */
     GRAPH_DrawReliefRect(hdc, &lphc->RectButton, 2, 2, FALSE);
     GRAPH_DrawBitmap(hdc, hComboBit,
-		     lphc->RectButton.left + 3,lphc->RectButton.top + 2,
+		     lphc->RectButton.left + 2,lphc->RectButton.top + 2,
 		     0, 0, CBitWidth, CBitHeight );
   }
   if (!IsWindowVisible(hwnd) || !lphl->bRedrawFlag 
@@ -234,12 +286,12 @@
   if (hBrush == 0) hBrush = GetStockObject(WHITE_BRUSH);
 
   GetClientRect(hwnd, &rect);
+
+  CBCheckSize(hwnd);
   rect.right -= (lphc->RectButton.right - lphc->RectButton.left);
 
   lpls = ListBoxGetItem(lphl,lphl->ItemFocused);
   if (lpls != NULL) {  
-    height = lpls->mis.itemHeight;
-    rect.bottom = rect.top + height;
     FillRect(hdc, &rect, hBrush);
     ListBoxDrawItem (hwnd, lphl, hdc, lpls, &rect, ODA_DRAWENTIRE, 0);
     if (GetFocus() == hwnd)
@@ -389,7 +441,6 @@
     wRet = ListBoxInsertString(lphl, wParam, (LPSTR)PTR_SEG_TO_LIN(lParam));
   else
     wRet = ListBoxInsertString(lphl, wParam, (LPSTR)lParam);
-
   ComboUpdateWindow(hwnd, lphl, lphc, TRUE);
   return wRet;
 }
@@ -593,6 +644,59 @@
 
 
 /***********************************************************************
+ *             CBCheckSize
+ */
+static BOOL CBCheckSize(HWND hwnd)
+{
+  LPHEADCOMBO  lphc = ComboGetStorageHeader(hwnd);
+  LPHEADLIST   lphl = ComboGetListHeader(hwnd);
+  LONG         cstyle = GetWindowLong(hwnd,GWL_STYLE);
+  RECT         cRect,wRect;
+
+  /* TODO - The size of combo's and their listboxes is still broken */
+
+  if (lphc->hWndLBox == 0) return FALSE;
+
+  GetClientRect(hwnd,&cRect);
+  GetWindowRect(hwnd,&wRect);
+
+  dprintf_vxd(stddeb,"CBCheckSize: cRect %d,%d-%d,%d  wRect %d,%d-%d,%d\n",
+		cRect.left,cRect.top,cRect.right,cRect.bottom,
+		wRect.left,wRect.top,wRect.right,wRect.bottom);
+
+  if ((cRect.bottom - cRect.top) > 
+      (lphl->StdItemHeight + 2*SYSMETRICS_CYBORDER)) {
+    SetWindowPos(hwnd, 0, 0, 0, 
+		 cRect.right-cRect.left,
+		 lphl->StdItemHeight+2*SYSMETRICS_CYBORDER, 
+		 SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE );
+    GetClientRect(hwnd,&cRect);
+    GetWindowRect(hwnd,&wRect);
+  }
+
+  switch (cstyle & 3) {
+    case CBS_SIMPLE:
+      break;
+    case CBS_DROPDOWN:
+    case CBS_DROPDOWNLIST:
+      lphc->RectButton.right = cRect.right;
+      lphc->RectButton.left = cRect.right - 2*SYSMETRICS_CXBORDER - 4 
+	                       - CBitWidth;
+      lphc->RectButton.top = cRect.top;
+      lphc->RectButton.bottom = cRect.bottom;
+      break;
+    default:
+      fprintf(stderr,"CBCheckSize: style %lx not recognized!\n",cstyle);
+      return FALSE;
+    }
+
+  CBLCheckSize(hwnd);
+
+  return TRUE;
+}
+
+
+/***********************************************************************
  *           ComboWndProc
  */
 LRESULT ComboBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -610,6 +714,7 @@
      case WM_LBUTTONDOWN: return CBLButtonDown(hwnd, wParam, lParam);
      case WM_SETFOCUS: return CBSetFocus(hwnd, wParam, lParam);
      case WM_KILLFOCUS: return CBKillFocus(hwnd, wParam, lParam);
+     case WM_SIZE: return CBCheckSize(hwnd);
      case CB_RESETCONTENT: return CBResetContent(hwnd, wParam, lParam);
      case CB_DIR: return CBDir(hwnd, wParam, lParam);
      case CB_ADDSTRING: return CBAddString(hwnd, wParam, lParam);
@@ -736,6 +841,7 @@
   PAINTSTRUCT  ps;
   HBRUSH       hBrush;
   HFONT        hOldFont;
+  WND * wndPtr = WIN_FindWndPtr(hwnd);
   HWND  combohwnd = CLBoxGetCombo(hwnd);
   HDC 	hdc;
   RECT 	rect;
@@ -750,17 +856,12 @@
   }
 
   hOldFont = SelectObject(hdc, lphl->hFont);
-#ifdef WINELIB32
-  hBrush = SendMessage(lphl->hParent, WM_CTLCOLORLISTBOX, hdc, hwnd);
-#else
-  hBrush = SendMessage(lphl->hParent, WM_CTLCOLOR, hdc,
-		       MAKELONG(hwnd, CTLCOLOR_LISTBOX));
-#endif
-
-  if (hBrush == 0) hBrush = GetStockObject(WHITE_BRUSH);
+  /* listboxes should be white */
+  hBrush = GetStockObject(WHITE_BRUSH);
 
   GetClientRect(hwnd, &rect);
   FillRect(hdc, &rect, hBrush);
+  CBLCheckSize(hwnd);
 
   lpls = lphl->lpFirst;
 
@@ -797,7 +898,10 @@
 
     lpls = lpls->lpNext;
   }
-  SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
+
+  if (wndPtr->dwStyle & WS_VSCROLL) 
+      SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
+
   SelectObject(hdc,hOldFont);
   EndPaint( hwnd, &ps );
   return 0;
@@ -967,6 +1071,57 @@
   return 0;
 }
 
+
+/***********************************************************************
+ *             CBLCheckSize
+ */
+static BOOL CBLCheckSize(HWND hwnd)
+{
+  LPHEADCOMBO  lphc = ComboGetStorageHeader(hwnd);
+  LPHEADLIST   lphl = ComboGetListHeader(hwnd);
+  LPLISTSTRUCT lpls;
+  HWND         hWndLBox;
+  RECT cRect,wRect,lRect,lwRect;
+  int totheight;
+  char className[80];
+
+  GetClassName(hwnd,className,80);
+  fflush(stddeb);
+  if (strncmp(className,"COMBOBOX",8)) return FALSE;
+  if ((hWndLBox = lphc->hWndLBox) == 0) return FALSE;
+  dprintf_vxd(stddeb,"CBLCheckSize headers hw %04x  lb %04x  name %s\n",
+		hwnd,hWndLBox,className);
+
+  GetClientRect(hwnd,&cRect);
+  GetWindowRect(hwnd,&wRect);
+  GetClientRect(hWndLBox,&lRect);
+  GetWindowRect(hWndLBox,&lwRect);
+
+  dprintf_vxd(stddeb,"CBLCheckSize: init cRect %d,%d-%d,%d  wRect %d,%d-%d,%d\n",
+		cRect.left,cRect.top,cRect.right,cRect.bottom,
+		wRect.left,wRect.top,wRect.right,wRect.bottom);
+  dprintf_vxd(stddeb,"                   lRect %d,%d-%d,%d  lwRect %d,%d-%d,%d\n",
+	      lRect.left,lRect.top,lRect.right,lRect.bottom,
+	      lwRect.left,lwRect.top,lwRect.right,lwRect.bottom);
+  fflush(stddeb);
+  
+  totheight = 0;
+  for (lpls=lphl->lpFirst; lpls != NULL; lpls=lpls->lpNext)
+    totheight += lpls->mis.itemHeight;
+
+  /* TODO: This isn't really what windows does */
+  if (lRect.bottom-lRect.top < 3*lphl->StdItemHeight) {
+    dprintf_vxd(stddeb,"    Changing; totHeight %d  StdItemHght %d\n",
+		totheight,lphl->StdItemHeight);
+    SetWindowPos(hWndLBox, 0, lRect.left, lRect.top, 
+		 lwRect.right-lwRect.left, totheight+2*SYSMETRICS_CYBORDER, 
+		 SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE );
+  }
+
+  return TRUE;
+}
+
+
 /***********************************************************************
  *           ComboLBoxWndProc
  */
@@ -984,6 +1139,7 @@
      case WM_LBUTTONUP: return CBLLButtonUp(hwnd, wParam, lParam);
      case WM_MOUSEMOVE: return CBLMouseMove(hwnd, wParam, lParam);
      case WM_VSCROLL: return CBLVScroll(hwnd, wParam, lParam);
+     case WM_SIZE: return CBLCheckSize(hwnd);
     }
     return DefWindowProc(hwnd, message, wParam, lParam);
 }
diff --git a/controls/edit.c b/controls/edit.c
index 296365c..d55c954 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -48,7 +48,7 @@
 typedef struct
 {
 	UINT TextWidth;		/* width of the widest line in pixels */
-	HLOCAL hBuf;
+	HLOCAL16 hBuf;
 	char *text;
 	HFONT hFont;
 	LINEDEF *LineDefs;
@@ -64,7 +64,7 @@
 	UINT SelStart;		/* offset of selection start, == SelEnd if no selection */
 	UINT SelEnd;		/* offset of selection end == current caret position */
 	UINT NumTabStops;
-	LPINT TabStops;
+	LPINT16 TabStops;
 	EDITWORDBREAKPROC WordBreakProc;
 	char PasswordChar;
 } EDITSTATE;
@@ -858,7 +858,7 @@
 	RECT rcWnd;
 	RECT rcLine;
 	RECT rcUpdate;
-	UINT line;
+	UINT l;
 
 	if (end == start )
 		return;
@@ -894,10 +894,10 @@
 				&rcLine);
 		if (IntersectRect(&rcUpdate, &rcWnd, &rcLine))
 			InvalidateRect(wndPtr->hwndSelf, &rcUpdate, FALSE);
-		for (line = sl + 1 ; line < el ; line++) {
-			EDIT_GetLineRect(wndPtr, line, 0,
+		for (l = sl + 1 ; l < el ; l++) {
+			EDIT_GetLineRect(wndPtr, l, 0,
 				(UINT)EDIT_EM_LineLength(wndPtr,
-					(UINT)EDIT_EM_LineIndex(wndPtr, line, 0L), 0L),
+					(UINT)EDIT_EM_LineIndex(wndPtr, l, 0L), 0L),
 				&rcLine);
 			if (IntersectRect(&rcUpdate, &rcWnd, &rcLine))
 				InvalidateRect(wndPtr->hwndSelf, &rcUpdate, FALSE);
@@ -1262,7 +1262,7 @@
 	UINT ret;
 	char *text;
 	UINT li;
-	INT xoff;
+	UINT xoff;
 
 	if (!count)
 		return 0;
@@ -1318,7 +1318,7 @@
 {
 	const char *str = (char *)lParam;
 	int strl = strlen(str);
-	int tl = EDIT_WM_GetTextLength(wndPtr, 0, 0L);
+	UINT tl = (UINT)EDIT_WM_GetTextLength(wndPtr, 0, 0L);
 	UINT s = LOWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
 	UINT e = HIWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
 	int i;
@@ -1365,24 +1365,24 @@
 static void EDIT_ScrollIntoView(WND *wndPtr)
 {
 	UINT e = HIWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
-	int l = EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	int lineindex = EDIT_EM_LineIndex(wndPtr, l, 0L);
-	int firstvis = (int)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	int vislinecount = EDIT_GetVisibleLineCount(wndPtr);
-	int wndwidth = EDIT_GetWndWidth(wndPtr);
-	int charwidth = EDIT_GetAveCharWidth(wndPtr);
-	int x = EDIT_WndXFromCol(wndPtr, l, e - lineindex);
+	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
+	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
+	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
+	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
+	UINT ww = EDIT_GetWndWidth(wndPtr);
+	UINT cw = EDIT_GetAveCharWidth(wndPtr);
+	INT x = EDIT_WndXFromCol(wndPtr, l, e - li);
 	int dy = 0;
 	int dx = 0;
 
-	if (l >= firstvis + vislinecount)
-		dy = l - vislinecount + 1 - firstvis;
-	if (l < firstvis)
-		dy = l - firstvis;
+	if (l >= fv + vlc)
+		dy = l - vlc + 1 - fv;
+	if (l < fv)
+		dy = l - fv;
 	if (x < 0)
-		dx = x - wndwidth / HSCROLL_FRACTION / charwidth * charwidth;
-	if (x > wndwidth)
-		dx = x - (HSCROLL_FRACTION - 1) * wndwidth / HSCROLL_FRACTION / charwidth * charwidth;
+		dx = x - ww / HSCROLL_FRACTION / cw * cw;
+	if (x > ww)
+		dx = x - (HSCROLL_FRACTION - 1) * ww / HSCROLL_FRACTION / cw * cw;
 	if (dy || dx) {
 		EDIT_EM_LineScroll(wndPtr, 0, MAKELPARAM(dy, dx));
 		if (dy) 
@@ -1404,24 +1404,24 @@
 {	
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 	char *text = EDIT_GetPointer(wndPtr);
-	int ret;
+	INT ret;
 	HDC hdc;
 	HFONT hFont;
 	HFONT oldFont = 0;
-	int linecount = (int)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	int lineindex = EDIT_EM_LineIndex(wndPtr, line, 0L);
-	int linelength = EDIT_EM_LineLength(wndPtr, lineindex, 0L);
-	int xoffset = EDIT_GetXOffset(wndPtr);
+	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
+	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, line, 0L);
+	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, li, 0L);
+	UINT xoff = EDIT_GetXOffset(wndPtr);
 
 	hdc = GetDC(wndPtr->hwndSelf);
 	hFont = (HFONT)EDIT_WM_GetFont(wndPtr, 0, 0L);
 	if (hFont)
 		oldFont = SelectObject(hdc, hFont);
-	line = MAX(0, MIN(line, linecount - 1));
-	col = MAX(0, MIN(col, linelength));
+	line = MAX(0, MIN(line, lc - 1));
+	col = MIN(col, ll);
 	ret = LOWORD(GetTabbedTextExtent(hdc,
-			text + lineindex, col,
-			es->NumTabStops, es->TabStops)) - xoffset;
+			text + li, col,
+			es->NumTabStops, es->TabStops)) - xoff;
 	if (hFont)
 		SelectObject(hdc, oldFont);
 	ReleaseDC(wndPtr->hwndSelf, hdc);
@@ -1438,10 +1438,10 @@
  */
 static INT EDIT_WndYFromLine(WND *wndPtr, UINT line)
 {
-	int firstvis = (int)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	int lineheight = EDIT_GetLineHeight(wndPtr);
+	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
+	UINT lh = EDIT_GetLineHeight(wndPtr);
 
-	return (line - firstvis) * lineheight;
+	return (line - fv) * lh;
 }
 
 
@@ -1458,7 +1458,7 @@
  */
 static INT EDIT_WordBreakProc(char *s, INT index, INT count, INT action)
 {
-	int ret = 0;
+	INT ret = 0;
 
 	dprintf_edit(stddeb, "edit: EDIT_WordBreakProc: s=%p, index=%d"
 			", count=%d, action=%d\n", s, index, count, action);
@@ -1582,17 +1582,17 @@
 	char *src;
 	char *dst;
 	UINT len;
-	int i;
-	int linecount = (int)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
+	UINT i;
+	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
 
 	if (!IsMultiLine(wndPtr))
 		wParam = 0;
-	if ((UINT)wParam >= linecount)
+	if ((UINT)wParam >= lc)
 		return 0L;
 	text = EDIT_GetPointer(wndPtr);
-	src = text + EDIT_EM_LineIndex(wndPtr, wParam, 0L);
+	src = text + (UINT)EDIT_EM_LineIndex(wndPtr, wParam, 0L);
 	dst = (char *)PTR_SEG_TO_LIN(lParam);
-	len = MIN(*(WORD *)dst, EDIT_EM_LineLength(wndPtr, wParam, 0L));
+	len = MIN(*(WORD *)dst, (UINT)EDIT_EM_LineLength(wndPtr, wParam, 0L));
 	for (i = 0 ; i < len ; i++) {
 		*dst = *src;
 		src++;
@@ -1669,7 +1669,7 @@
  *
  *	EM_GETTHUMB
  *
- *	undocumented: is this right ?
+ *	FIXME: undocumented: is this right ?
  *
  */
 static LRESULT EDIT_EM_GetThumb(WND *wndPtr, WPARAM wParam, LPARAM lParam)
@@ -1723,14 +1723,14 @@
  */
 static LRESULT EDIT_EM_LineFromChar(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
-	int l;
+	UINT l;
 
 	if (!IsMultiLine(wndPtr))
 		return 0L;
 	if ((INT)wParam == -1)
 		wParam = HIWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
-	l = (int)EDIT_EM_GetLineCount(wndPtr, 0, 0L) - 1;
-	while (EDIT_EM_LineIndex(wndPtr, l, 0L) > (UINT)wParam)
+	l = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L) - 1;
+	while ((UINT)EDIT_EM_LineIndex(wndPtr, l, 0L) > (UINT)wParam)
 		l--;
 	return (LRESULT)l;
 }
@@ -1745,16 +1745,17 @@
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 	UINT e;
-	int l;
+	UINT l;
+	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
 
 	if ((INT)wParam == -1) {
 		e = HIWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
-		l = (int)EDIT_EM_GetLineCount(wndPtr, 0, 0L) - 1;
+		l = lc - 1;
 		while (es->LineDefs[l].offset > e)
 			l--;
 		return (LRESULT)es->LineDefs[l].offset;
 	}
-	if ((UINT)wParam >= es->LineCount)
+	if ((UINT)wParam >= lc)
 		return -1L;
 	return (LRESULT)es->LineDefs[(UINT)wParam].offset;
 }
@@ -1768,21 +1769,21 @@
 static LRESULT EDIT_EM_LineLength(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	UINT selstart;
-	UINT selend;
-	int startline;
-	int endline;
+	UINT s;
+	UINT e;
+	UINT sl;
+	UINT el;
 
 	if (!IsMultiLine(wndPtr))
 		return (LRESULT)es->LineDefs[0].length;
 	if ((INT)wParam == -1) {
-		selstart = LOWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
-		selend = HIWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
-		startline = EDIT_EM_LineFromChar(wndPtr, selstart, 0L);
-		endline = EDIT_EM_LineFromChar(wndPtr, selend, 0L);
-		return (LRESULT)(selstart - es->LineDefs[startline].offset +
-				es->LineDefs[endline].offset +
-				es->LineDefs[endline].length - selend);
+		s = LOWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
+		e = HIWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
+		sl = (UINT)EDIT_EM_LineFromChar(wndPtr, s, 0L);
+		el = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
+		return (LRESULT)(s - es->LineDefs[sl].offset +
+				es->LineDefs[el].offset +
+				es->LineDefs[el].length - e);
 	}
 	return (LRESULT)es->LineDefs[(UINT)EDIT_EM_LineFromChar(wndPtr, wParam, 0L)].length;
 }
@@ -1796,28 +1797,24 @@
 static LRESULT EDIT_EM_LineScroll(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	int linecount = (int)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	int firstvis = (int)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	int newfirstvis = firstvis + (INT)LOWORD(lParam);
-	int xoffset = EDIT_GetXOffset(wndPtr);
-	int newxoffset = xoffset + (INT)HIWORD(lParam);
-	int textwidth = EDIT_GetTextWidth(wndPtr);
-	int dx;
-	int dy;
+	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
+	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
+	UINT nfv = MAX(0, fv + (INT)LOWORD(lParam));
+	UINT xoff = EDIT_GetXOffset(wndPtr);
+	UINT nxoff = MAX(0, xoff + (INT)HIWORD(lParam));
+	UINT tw = EDIT_GetTextWidth(wndPtr);
+	INT dx;
+	INT dy;
 	POINT pos;
 	HRGN hRgn;
 
-	if (newfirstvis < 0)
-		newfirstvis = 0;
-	if (newfirstvis >= linecount)
-		newfirstvis = linecount - 1;
+	if (nfv >= lc)
+		nfv = lc - 1;
 
-	if (newxoffset < 0)
-		newxoffset = 0;
-	if (newxoffset >= textwidth)
-		newxoffset = textwidth;
-	dx = xoffset - newxoffset;
-	dy = EDIT_WndYFromLine(wndPtr, firstvis) - EDIT_WndYFromLine(wndPtr, newfirstvis);
+	if (nxoff >= tw)
+		nxoff = tw;
+	dx = xoff - nxoff;
+	dy = EDIT_WndYFromLine(wndPtr, fv) - EDIT_WndYFromLine(wndPtr, nfv);
 	if (dx || dy) {
 		if (wndPtr->hwndSelf == GetFocus())
 			HideCaret(wndPtr->hwndSelf);
@@ -1830,8 +1827,8 @@
 			DeleteObject(hRgn);
 			ScrollWindow(wndPtr->hwndSelf, dx, dy, NULL, NULL);
 		}
-		es->FirstVisibleLine = newfirstvis;
-		es->XOffset = newxoffset;
+		es->FirstVisibleLine = nfv;
+		es->XOffset = nxoff;
 		if (IsVScrollBar(wndPtr))
 			SetScrollPos(wndPtr->hwndSelf, SB_VERT,
 				EDIT_WM_VScroll(wndPtr, EM_GETTHUMB, 0L), TRUE);
@@ -1888,7 +1885,7 @@
 		/*
 		 *	old buffer is freed by caller
 		 */
-		es->hBuf = (HLOCAL)wParam;
+		es->hBuf = (HLOCAL16)wParam;
 		es->BufSize = LOCAL_Size(wndPtr->hInstance, es->hBuf) - 1;
 		es->LineCount = 0;
 		es->FirstVisibleLine = 0;
@@ -1898,6 +1895,7 @@
 		EDIT_BuildLineDefs(wndPtr);
 		if (EDIT_GetRedraw(wndPtr))
 			InvalidateRect(wndPtr->hwndSelf, NULL, TRUE);
+		EDIT_ScrollIntoView(wndPtr);
 	}
 	return 0L;
 }
@@ -1982,9 +1980,9 @@
 	UINT ne = HIWORD(lParam);
 	UINT s = LOWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
 	UINT e = HIWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
-	int el;
-	int elineindex;
-	int tl = EDIT_WM_GetTextLength(wndPtr, 0, 0L);
+	UINT el;
+	UINT eli;
+	UINT tl = (UINT)EDIT_WM_GetTextLength(wndPtr, 0, 0L);
 
 	if ((INT)ns == -1) {
 		ns = e;
@@ -1997,9 +1995,9 @@
 	es->SelStart = ns;
 	es->SelEnd = ne;
 	if (wndPtr->hwndSelf == GetFocus()) {
-		el = EDIT_EM_LineFromChar(wndPtr, ne, 0L);
-		elineindex = EDIT_EM_LineIndex(wndPtr, el, 0L);
-		SetCaretPos(EDIT_WndXFromCol(wndPtr, el, ne - elineindex),
+		el = (UINT)EDIT_EM_LineFromChar(wndPtr, ne, 0L);
+		eli = (UINT)EDIT_EM_LineIndex(wndPtr, el, 0L);
+		SetCaretPos(EDIT_WndXFromCol(wndPtr, el, ne - eli),
 				EDIT_WndYFromLine(wndPtr, el));
 	}
 	if (!wParam)
@@ -2038,9 +2036,9 @@
 	if (!wParam)
 		es->TabStops = NULL;
 	else {
-		es->TabStops = (LPINT)xmalloc(wParam * sizeof(unsigned short));
-		memcpy(es->TabStops, (LPINT)PTR_SEG_TO_LIN(lParam),
-				(UINT)wParam * sizeof(INT));
+		es->TabStops = (LPINT16)xmalloc(wParam * sizeof(INT16));
+		memcpy(es->TabStops, (LPINT16)PTR_SEG_TO_LIN(lParam),
+				(UINT)wParam * sizeof(INT16));
 	}
 	return 1L;
 }
@@ -2158,14 +2156,14 @@
 	if (e == s)
 		return -1L;
 	ORDER_UINT(s, e);
-	hdst = GlobalAlloc(GMEM_MOVEABLE, (DWORD)(e - s + 1));
-	dst = GlobalLock(hdst);
+	hdst = GlobalAlloc16(GMEM_MOVEABLE, (DWORD)(e - s + 1));
+	dst = GlobalLock16(hdst);
 	text = EDIT_GetPointer(wndPtr);
 	src = text + s;
 	for (i = 0 ; i < e - s ; i++)
 		*dst++ = *src++;
 	*dst = '\0';
-	GlobalUnlock(hdst);
+	GlobalUnlock16(hdst);
 	OpenClipboard(wndPtr->hwndSelf);
 	EmptyClipboard();
 	SetClipboardData(CF_TEXT, hdst);
@@ -2208,8 +2206,15 @@
 		es->BufLimit = BUFLIMIT_SINGLE;
 		es->PasswordChar = (cs->style & ES_PASSWORD) ? '*' : '\0';
 	}
+	if (!LOCAL_HeapSize(wndPtr->hInstance)) {
+		if (!LocalInit(wndPtr->hInstance, 0, GlobalSize(wndPtr->hInstance))) {
+			fprintf(stderr, "edit: WM_CREATE: could not initialize local heap\n");
+			return -1L;
+		}
+		dprintf_edit(stddeb, "edit: WM_CREATE: local heap initialized\n");
+	}
 	if (!(es->hBuf = LOCAL_Alloc(wndPtr->hInstance, LMEM_MOVEABLE, es->BufSize + 1))) {
-		fprintf(stderr, "edit: WM_CREATE: unable to heap buffer, please report !\n");
+		fprintf(stderr, "edit: WM_CREATE: unable to allocate buffer\n");
 		return -1L;
 	}
 	es->BufSize = LOCAL_Size(wndPtr->hInstance, es->hBuf) - 1;
@@ -2348,11 +2353,9 @@
  */
 static LRESULT EDIT_WM_GetTextLength(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
-	LRESULT ret;
 	char *text = EDIT_GetPointer(wndPtr);
 
-	ret = (LRESULT)strlen(text);
-	return ret;
+	return (LRESULT)strlen(text);
 }
  
 
@@ -2365,43 +2368,43 @@
  */
 static LRESULT EDIT_WM_HScroll(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
-	int wndwidth = EDIT_GetWndWidth(wndPtr);
-	int textwidth = EDIT_GetTextWidth(wndPtr);
-	int charwidth = EDIT_GetAveCharWidth(wndPtr);
-	int xoffset = EDIT_GetXOffset(wndPtr);
-	int dx = 0;
+	UINT ww = EDIT_GetWndWidth(wndPtr);
+	UINT tw = EDIT_GetTextWidth(wndPtr);
+	UINT cw = EDIT_GetAveCharWidth(wndPtr);
+	UINT xoff = EDIT_GetXOffset(wndPtr);
+	INT dx = 0;
 	BOOL not = TRUE;
 	LRESULT ret = 0L;
 
 	switch (wParam) {
 	case SB_LINELEFT:
-		dx = -charwidth;
+		dx = -cw;
 		break;
 	case SB_LINERIGHT:
-		dx = charwidth;
+		dx = cw;
 		break;
 	case SB_PAGELEFT:
-		dx = -wndwidth / HSCROLL_FRACTION / charwidth * charwidth;
+		dx = -ww / HSCROLL_FRACTION / cw * cw;
 		break;
 	case SB_PAGERIGHT:
-		dx = wndwidth / HSCROLL_FRACTION / charwidth * charwidth;
+		dx = ww / HSCROLL_FRACTION / cw * cw;
 		break;
 	case SB_LEFT:
-		dx = -xoffset;
+		dx = -xoff;
 		break;
 	case SB_RIGHT:
-		dx = textwidth - xoffset;
+		dx = tw - xoff;
 		break;
 	case SB_THUMBTRACK:
 /*
  *		not = FALSE;
  */
 	case SB_THUMBPOSITION:
-		dx = LOWORD(lParam) * textwidth / 100 - xoffset;
+		dx = LOWORD(lParam) * tw / 100 - xoff;
 		break;
 	/* The next two are undocumented ! */
 	case EM_GETTHUMB:
-		ret = textwidth ? MAKELONG(xoffset * 100 / textwidth, 0) : 0;
+		ret = tw ? MAKELONG(xoff * 100 / tw, 0) : 0;
 		break;
 	case EM_LINESCROLL:
 		dx = LOWORD(lParam);
@@ -2539,11 +2542,11 @@
  */
 static LRESULT EDIT_WM_LButtonDblClk(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
-	int s;
+	UINT s;
 	UINT e = HIWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
-	UINT l = EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	int li = EDIT_EM_LineIndex(wndPtr, l, 0L);
-	int ll = EDIT_EM_LineLength(wndPtr, e, 0L);
+	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
+	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
+	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, e, 0L);
 	char *text = EDIT_GetPointer(wndPtr);
 
 	s = li + EDIT_CallWordBreakProc(wndPtr, text + li, e - li, ll, WB_LEFT);
@@ -2575,7 +2578,7 @@
 	l = MIN(fv + vlc - 1, MAX(fv, l));
 	x = MIN(EDIT_GetWndWidth(wndPtr), MAX(0, x));
 	c = EDIT_ColFromWndX(wndPtr, l, x);
-	li = EDIT_EM_LineIndex(wndPtr, l, 0L);
+	li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
 	e = li + c;
 	if (GetKeyState(VK_SHIFT) & 0x8000)
 		s = LOWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
@@ -2625,7 +2628,7 @@
 		x = MIN(EDIT_GetWndWidth(wndPtr), MAX(0, x));
 		c = EDIT_ColFromWndX(wndPtr, l, x);
 		s = LOWORD(EDIT_EM_GetSel(wndPtr, 0, 0L));
-		li = EDIT_EM_LineIndex(wndPtr, l, 0L);
+		li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
 		EDIT_EM_SetSel(wndPtr, 1, MAKELPARAM(s, li + c));
 	}
 	return 0L;
@@ -2639,10 +2642,11 @@
  */
 static LRESULT EDIT_WM_Paint(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
-	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 	PAINTSTRUCT ps;
-	int i;
-	int firstvis = (int)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
+	UINT i;
+	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
+	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
+	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
 	HDC hdc;
 	HFONT hFont;
 	HFONT oldFont = 0;
@@ -2663,7 +2667,7 @@
 	if (!IsWindowEnabled(wndPtr->hwndSelf))
 		SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT));
 	GetClipBox(hdc, &rcRgn);
-	for (i = firstvis ; i <= MIN(firstvis + EDIT_GetVisibleLineCount(wndPtr), firstvis + es->LineCount - 1) ; i++ ) {
+	for (i = fv ; i <= MIN(fv + vlc, fv + lc - 1) ; i++ ) {
 		EDIT_GetLineRect(wndPtr, i, 0, -1, &rcLine);
 		if (IntersectRect(&rc, &rcRgn, &rcLine))
 			EDIT_PaintLine(wndPtr, hdc, i, rev);
@@ -2687,9 +2691,9 @@
 
 	OpenClipboard(wndPtr->hwndSelf);
 	if ((hsrc = GetClipboardData(CF_TEXT))) {
-		src = (char *)GlobalLock(hsrc);
+		src = (char *)GlobalLock16(hsrc);
 		EDIT_ReplaceSel(wndPtr, 0, (LPARAM)src);
-		GlobalUnlock(hsrc);
+		GlobalUnlock16(hsrc);
 	}
 	CloseClipboard();
 	return -1L;
@@ -2749,7 +2753,7 @@
 	if (es->hFont)
 		oldFont = SelectObject(hdc, es->hFont);
 	GetTextMetrics(hdc, &tm);
-	es->LineHeight = HIWORD(GetTextExtent(hdc, "", 0));
+	es->LineHeight = HIWORD(GetTextExtent(hdc, "X", 1));
 	es->AveCharWidth = tm.tmAveCharWidth;
 	if (es->hFont)
 		SelectObject(hdc, oldFont);
@@ -2794,6 +2798,7 @@
 		EDIT_EM_ReplaceSel(wndPtr, 0, lParam);
 	EDIT_EM_EmptyUndoBuffer(wndPtr, 0, 0L);
 	EDIT_EM_SetModify(wndPtr, TRUE, 0L);
+	EDIT_ScrollIntoView(wndPtr);
 	return 0L;
 }
 
@@ -2825,10 +2830,10 @@
  */
 static LRESULT EDIT_WM_VScroll(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
-	int linecount = (int)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	int firstvis = (int)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	int vislinecount = EDIT_GetVisibleLineCount(wndPtr);
-	int dy = 0;
+	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
+	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
+	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
+	INT dy = 0;
 	BOOL not = TRUE;
 	LRESULT ret = 0L;
 
@@ -2840,27 +2845,27 @@
 		dy = 1;
 		break;
 	case SB_PAGEUP:
-		dy = -vislinecount;
+		dy = -vlc;
 		break;
 	case SB_PAGEDOWN:
-		dy = vislinecount;
+		dy = vlc;
 		break;
 	case SB_TOP:
-		dy = -firstvis;
+		dy = -fv;
 		break;
 	case SB_BOTTOM:
-		dy = linecount - 1 - firstvis;
+		dy = lc - 1 - fv;
 		break;
 	case SB_THUMBTRACK:
 /*
  *		not = FALSE;
  */
 	case SB_THUMBPOSITION:
-		dy = LOWORD(lParam) * (linecount - 1) / 100 - firstvis;
+		dy = LOWORD(lParam) * (lc - 1) / 100 - fv;
 		break;
 	/* The next two are undocumented ! */
 	case EM_GETTHUMB:
-		ret = (linecount > 1) ? MAKELONG(firstvis * 100 / (linecount - 1), 0) : 0L;
+		ret = (lc > 1) ? MAKELONG(fv * 100 / (lc - 1), 0) : 0L;
 		break;
 	case EM_LINESCROLL:
 		dy = LOWORD(lParam);
diff --git a/controls/listbox.c b/controls/listbox.c
index dbec947..b6d31c0 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -130,14 +130,9 @@
     lphl->hDrawItemStruct = 0;
   }
 
-#if 0
-  HeapHandle = GlobalAlloc(GMEM_FIXED, LIST_HEAP_SIZE);
-  HeapBase = GlobalLock(HeapHandle);
-  HEAP_Init(&lphl->Heap, HeapBase, LIST_HEAP_SIZE);
-#endif
 /* WINELIBS list boxes do not operate on local heaps */
 #ifndef WINELIB
-  lphl->HeapSel = GlobalAlloc(GMEM_FIXED,LIST_HEAP_SIZE);
+  lphl->HeapSel = GlobalAlloc16(GMEM_FIXED,LIST_HEAP_SIZE);
   LocalInit( lphl->HeapSel, 0, LIST_HEAP_SIZE-1);
 #else
   lphl->HeapSel = 0;
@@ -150,7 +145,7 @@
     USER_HEAP_FREE(lphl->hDrawItemStruct);
 
   /* XXX need to free lphl->Heap */
-  GlobalFree(lphl->HeapSel);
+  GlobalFree16(lphl->HeapSel);
   free(lphl);
 }
 
@@ -184,11 +179,14 @@
 
 void ListBoxUpdateWindow(HWND hwnd, LPHEADLIST lphl, BOOL repaint)
 {
-  SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
-  if (lphl->ItemsPerColumn != 0) {
+  WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+  if (wndPtr->dwStyle & WS_VSCROLL)
+    SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
+  if ((wndPtr->dwStyle & WS_HSCROLL) && (lphl->ItemsPerColumn != 0))
     SetScrollRange(hwnd, SB_HORZ, 1, lphl->ItemsVisible /
 		   lphl->ItemsPerColumn + 1, TRUE);
-  }
+
   if (repaint && lphl->bRedrawFlag) {
     InvalidateRect(hwnd, NULL, TRUE);
   }
@@ -328,7 +326,8 @@
   SendMessage(lphl->hParent, WM_MEASUREITEM, 0, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
 
   if (lphl->dwStyle & LBS_OWNERDRAWFIXED) {
-    lphl->StdItemHeight = lpmeasure->itemHeight;
+    if (lpmeasure->itemHeight > lphl->StdItemHeight)
+      lphl->StdItemHeight = lpmeasure->itemHeight;
     lpls->mis.itemHeight = lpmeasure->itemHeight;
   }
 
@@ -356,6 +355,7 @@
 }
 
 
+
 int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPCSTR newstr)
 {
   LPLISTSTRUCT *lppls, lplsnew, lpls;
@@ -393,7 +393,7 @@
     hStr = LIST_HEAP_ALLOC(lphl, LMEM_MOVEABLE, strlen(newstr) + 1);
     str = (LPSTR)LIST_HEAP_ADDR(lphl, hStr);
     if (str == NULL) return LB_ERRSPACE;
-    strcpy(str, newstr);
+    strcpy(str, newstr); 
     lplsnew->itemText = str;
     /* I'm not so sure about the next one */
     lplsnew->mis.itemData = 0;
@@ -783,8 +783,10 @@
   GetClientRect(hwnd,&rect);
   lphl->ColumnsWidth = rect.right - rect.left;
 
-  SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
-  SetScrollRange(hwnd, SB_HORZ, 1, 1, TRUE);
+  if (dwStyle & WS_VSCROLL) 
+    SetScrollRange(hwnd, SB_VERT, 0, ListMaxFirstVisible(lphl), TRUE);
+  if (dwStyle & WS_HSCROLL) 
+    SetScrollRange(hwnd, SB_HORZ, 1, 1, TRUE);
 
   return 0;
 }
@@ -1307,7 +1309,6 @@
   RECT  rect, paintRect, scratchRect;
   int   i, top, height, maxwidth, ipc;
 
-
   top = 0;
 
   if (!IsWindowVisible(hwnd) || !lphl->bRedrawFlag) {
diff --git a/controls/menu.c b/controls/menu.c
index eecb575..20f4e06 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -62,9 +62,12 @@
   ((DWORD)MAKELONG( (WORD)(item)->hText, (item)->xTab ))
 
 extern void NC_DrawSysButton(HWND hwnd, HDC hdc, BOOL down);  /* nonclient.c */
+static HMENU MENU_CopySysMenu(void);
 
 static HBITMAP hStdCheck = 0;
 static HBITMAP hStdMnArrow = 0;
+static HMENU MENU_DefSysMenu = 0;  /* Default system menu */
+
 
 /* we _can_ use global popup window because there's no way 2 menues can
  * be tracked at the same time.
@@ -95,11 +98,27 @@
     arrow_bitmap_width = bm.bmWidth;
     arrow_bitmap_height = bm.bmHeight;
 
+    if (!(MENU_DefSysMenu = MENU_CopySysMenu()))
+    {
+        fprintf( stderr, "Unable to create default system menu\n" );
+        return FALSE;
+    }
     return TRUE;
 }
 
 
 /***********************************************************************
+ *           MENU_GetDefSysMenu
+ *
+ * Return the default system menu.
+ */
+HMENU MENU_GetDefSysMenu(void)
+{
+    return MENU_DefSysMenu;
+}
+
+
+/***********************************************************************
  *           MENU_HasSysMenu
  *
  * Check whether the window owning the menu bar has a system menu.
@@ -124,7 +143,7 @@
     POPUPMENU *menu;
 
     if (!(handle = SYSRES_LoadResource( SYSRES_MENU_SYSMENU ))) return 0;
-    hMenu = LoadMenuIndirect( WIN16_GlobalLock( handle ) );
+    hMenu = LoadMenuIndirect( WIN16_GlobalLock16( handle ) );
     SYSRES_FreeResource( handle );
     if (!hMenu)
     {
@@ -246,7 +265,7 @@
     int i;
     LONG menuchar;
 
-    if (!IsMenu( hmenu )) hmenu = GetSystemMenu( hwndOwner, FALSE);
+    if (!IsMenu( hmenu )) hmenu = WIN_FindWndPtr(hwndOwner)->hSysMenu;
     if (!hmenu) return -1;
 
     menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
@@ -692,7 +711,7 @@
 {
   /* This is supposed to be called when popup is hidden */
 
-  TDB* task = (TDB*)GlobalLock(hTask);
+  TDB* task = (TDB*)GlobalLock16(hTask);
 
   if( !task ) return 0;
 
@@ -730,7 +749,7 @@
 
     if (!pTopPWnd)
     {
-	pTopPWnd = WIN_FindWndPtr(CreateWindow( POPUPMENU_CLASS_ATOM, (SEGPTR)0,
+	pTopPWnd = WIN_FindWndPtr(CreateWindow16( POPUPMENU_CLASS_ATOM, (SEGPTR)0,
 				   		WS_POPUP | WS_BORDER, x, y, 
 				   		menu->Width + 2*SYSMETRICS_CXBORDER,
 				   		menu->Height + 2*SYSMETRICS_CYBORDER,
@@ -742,7 +761,7 @@
     if( uSubPWndLevel )
     {
 	/* create new window for the submenu */
-	HWND  hWnd = CreateWindow( POPUPMENU_CLASS_ATOM, (SEGPTR)0,
+	HWND  hWnd = CreateWindow16( POPUPMENU_CLASS_ATOM, (SEGPTR)0,
                                    WS_POPUP | WS_BORDER, x, y,
                                    menu->Width + 2*SYSMETRICS_CXBORDER,
                                    menu->Height + 2*SYSMETRICS_CYBORDER,
@@ -818,12 +837,12 @@
 #ifdef WINELIB32
 /* FIX: LostInfo */
             SendMessage( hwndOwner, WM_MENUSELECT,
-                         MAKEWPARAM( (DWORD)GetSystemMenu( lppop->hWnd, FALSE ),
+                         MAKEWPARAM( WIN_FindWndPtr(lppop->hWnd)->hSysMenu,
 				     lppop->wFlags | MF_MOUSESELECT ),
 			 (LPARAM)hmenu );
 #else
             SendMessage( hwndOwner, WM_MENUSELECT,
-                         GetSystemMenu( lppop->hWnd, FALSE ),
+                         WIN_FindWndPtr(lppop->hWnd)->hSysMenu,
                          MAKELONG( lppop->wFlags | MF_MOUSESELECT, hmenu ) );
 #endif
         }
@@ -1111,7 +1130,7 @@
     menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
     if (menu->FocusedItem == NO_SELECTED_ITEM) return 0;
     else if (menu->FocusedItem == SYSMENU_SELECTED)
-	return GetSystemMenu( menu->hWnd, FALSE );
+	return WIN_FindWndPtr(menu->hWnd)->hSysMenu;
 
     item = ((MENUITEM *)USER_HEAP_LIN_ADDR(menu->hItems)) + menu->FocusedItem;
     if (!(item->item_flags & MF_POPUP) || !(item->item_flags & MF_MOUSESELECT))
@@ -1135,7 +1154,7 @@
     if (menu->FocusedItem == NO_SELECTED_ITEM) return;
     if (menu->FocusedItem == SYSMENU_SELECTED)
     {
-	hsubmenu = GetSystemMenu( menu->hWnd, FALSE );
+	hsubmenu = WIN_FindWndPtr(menu->hWnd)->hSysMenu;
     }
     else
     {
@@ -1345,7 +1364,7 @@
     {
 	if (!MENU_IsInSysMenu( menu, pt )) return FALSE;
 	id = SYSMENU_SELECTED;
-	hsubmenu = GetSystemMenu( menu->hWnd, FALSE );
+	hsubmenu = WIN_FindWndPtr(menu->hWnd)->hSysMenu;
     }	
 
     if (menu->FocusedItem != id) return FALSE;
@@ -1498,7 +1517,7 @@
 			    HWND hwnd, LPRECT lprect )
 {
     MSG *msg;
-    HLOCAL hMsg;
+    HLOCAL16 hMsg;
     POPUPMENU *menu;
     HMENU hmenuCurrent = hmenu;
     BOOL fClosed = FALSE, fRemove;
@@ -2219,7 +2238,10 @@
 {
     LPPOPUPMENU lppop;
     dprintf_menu(stddeb,"DestroyMenu (%04x) !\n", hMenu);
+
     if (hMenu == 0) return FALSE;
+    /* Silently ignore attempts to destroy default system menu */
+    if (hMenu == MENU_DefSysMenu) return TRUE;
     lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
     if (!lppop || (lppop->wMagic != MENU_MAGIC)) return FALSE;
     lppop->wMagic = 0;  /* Mark it as destroyed */
@@ -2252,6 +2274,11 @@
     WND *wndPtr = WIN_FindWndPtr( hWnd );
     if (!wndPtr) return 0;
 
+    if (!wndPtr->hSysMenu || (wndPtr->hSysMenu == MENU_DefSysMenu))
+    {
+        wndPtr->hSysMenu = MENU_CopySysMenu();
+        return wndPtr->hSysMenu;
+    }
     if (!bRevert) return wndPtr->hSysMenu;
     if (wndPtr->hSysMenu) DestroyMenu(wndPtr->hSysMenu);
     wndPtr->hSysMenu = MENU_CopySysMenu();
@@ -2267,7 +2294,8 @@
     WND *wndPtr;
 
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return FALSE;
-    if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
+    if (wndPtr->hSysMenu && (wndPtr->hSysMenu != MENU_DefSysMenu))
+        DestroyMenu( wndPtr->hSysMenu );
     wndPtr->hSysMenu = hMenu;
     return TRUE;
 }
diff --git a/controls/scroll.c b/controls/scroll.c
index 27323a6..e0e7617 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -956,7 +956,7 @@
 /*************************************************************************
  *           GetScrollRange   (USER.65)
  */
-void GetScrollRange(HWND hwnd, int nBar, LPINT lpMin, LPINT lpMax)
+void GetScrollRange(HWND hwnd, int nBar, LPINT16 lpMin, LPINT16 lpMax)
 {
     SCROLLINFO *infoPtr;
 
diff --git a/controls/static.c b/controls/static.c
index 9f470b5..9b88116 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -58,10 +58,10 @@
     infoPtr->hIcon = hicon;
     if (hicon)
     {
-        CURSORICONINFO *info = (CURSORICONINFO *) GlobalLock( hicon );
+        CURSORICONINFO *info = (CURSORICONINFO *) GlobalLock16( hicon );
         SetWindowPos( wndPtr->hwndSelf, 0, 0, 0, info->nWidth, info->nHeight,
                      SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
-        GlobalUnlock( hicon );
+        GlobalUnlock16( hicon );
     }
     return prevIcon;
 }
diff --git a/controls/widgets.c b/controls/widgets.c
index e541835..1f737bc 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -15,7 +15,7 @@
 #include "module.h"
 #include "stackframe.h"
 
-static WNDCLASS WIDGETS_BuiltinClasses[] =
+static WNDCLASS16 WIDGETS_BuiltinClasses[] =
 {
     { CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
           (WNDPROC)"ButtonWndProc", 0, sizeof(BUTTONINFO),
@@ -61,7 +61,7 @@
 {
     int i;
     char name[20];
-    WNDCLASS *class = WIDGETS_BuiltinClasses;
+    WNDCLASS16 *class = WIDGETS_BuiltinClasses;
 
     for (i = 0; i < NB_BUILTIN_CLASSES; i++, class++)
     {
@@ -69,7 +69,7 @@
         class->lpszClassName = MAKE_SEGPTR(name);
         class->hCursor = LoadCursor( 0, IDC_ARROW );
         class->lpfnWndProc = MODULE_GetWndProcEntry16( (char *)class->lpfnWndProc );
-        if (!RegisterClass( class )) return FALSE;
+        if (!RegisterClass16( class )) return FALSE;
     }
     return TRUE;
 }
diff --git a/debugger/hash.c b/debugger/hash.c
index daeda4a..c0e6e28 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -241,7 +241,7 @@
         /* Now search the non-resident names table */
 
         if (!pModule->nrname_handle) continue;  /* No non-resident table */
-        cpnt = (char *)GlobalLock( pModule->nrname_handle );
+        cpnt = (char *)GlobalLock16( pModule->nrname_handle );
         while (*cpnt)
         {
             cpnt += *cpnt + 1 + sizeof(WORD);
diff --git a/etc/commdlg-ordinals b/etc/commdlg-ordinals
deleted file mode 100644
index b4c9e2a..0000000
--- a/etc/commdlg-ordinals
+++ /dev/null
@@ -1,26 +0,0 @@
-  1   2  0c17  GETOPENFILENAME exported, shared data
-  2   2  0c48  GETSAVEFILENAME exported, shared data
-  5   1  0ea1  CHOOSECOLOR exported, shared data
-  6   2  42a3  FILEOPENDLGPROC exported, shared data
-  7   2  446a  FILESAVEDLGPROC exported, shared data
-  8   1  0197  COLORDLGPROC exported, shared data
-  9   6  0000  LOADALTERBITMAP exported, shared data
- 11   5  0000  FINDTEXT exported, shared data
- 12   5  019c  REPLACETEXT exported, shared data
- 13   5  036d  FINDTEXTDLGPROC exported, shared data
- 14   5  0582  REPLACETEXTDLGPROC exported, shared data
- 15   4  0000  CHOOSEFONT exported, shared data
- 16   4  02b0  FORMATCHARDLGPROC exported, shared data
- 18   4  184e  FONTSTYLEENUMPROC exported, shared data
- 19   4  1096  FONTFAMILYENUMPROC exported, shared data
- 20   3  0c94  PRINTDLG exported, shared data
- 21   3  371f  PRINTDLGPROC exported, shared data
- 22   3  307a  PRINTSETUPDLGPROC exported, shared data
- 23   3  0000  EDITINTEGERONLY exported, shared data
- 25   1  1b46  WANTARROWS exported, shared data
- 26   6  01e7  COMMDLGEXTENDEDERROR exported, shared data
- 27   2  0c79  GETFILETITLE exported, shared data
- 28   6  01ad  WEP exported, shared data
- 29   2  10a5  DWLBSUBCLASS exported, shared data
- 30   3  0056  DWUPARROWHACK exported, shared data
- 31   2  100f  DWOKSUBCLASS exported, shared data
diff --git a/etc/ddeml-ordinals b/etc/ddeml-ordinals
deleted file mode 100644
index e4588c5..0000000
--- a/etc/ddeml-ordinals
+++ /dev/null
@@ -1,38 +0,0 @@
-  1   2  002c  WEP exported, shared data
-  2   1  0010  DDEINITIALIZE exported, shared data
-  3   1  03ae  DDEUNINITIALIZE exported, shared data
-  4   1  068a  DDECONNECTLIST exported, shared data
-  5   1  0948  DDEQUERYNEXTSERVER exported, shared data
-  6   1  0a46  DDEDISCONNECTLIST exported, shared data
-  7   1  0aac  DDECONNECT exported, shared data
-  8   1  0b4a  DDEDISCONNECT exported, shared data
-  9   1  0dac  DDEQUERYCONVINFO exported, shared data
- 10   1  1020  DDESETUSERHANDLE exported, shared data
- 11   1  1204  DDECLIENTTRANSACTION exported, shared data
- 12   1  1bf0  DDEABANDONTRANSACTION exported, shared data
- 13   1  1118  DDEPOSTADVISE exported, shared data
- 14   1  14e8  DDECREATEDATAHANDLE exported, shared data
- 15   1  1598  DDEADDDATA exported, shared data
- 16   1  17a8  DDEGETDATA exported, shared data
- 17   1  188a  DDEACCESSDATA exported, shared data
- 18   1  1916  DDEUNACCESSDATA exported, shared data
- 19   1  1946  DDEFREEDATAHANDLE exported, shared data
- 20   1  14a8  DDEGETLASTERROR exported, shared data
- 21   1  19a4  DDECREATESTRINGHANDLE exported, shared data
- 22   1  1a40  DDEFREESTRINGHANDLE exported, shared data
- 23   1  1b14  DDEQUERYSTRING exported, shared data
- 24   1  1aac  DDEKEEPSTRINGHANDLE exported, shared data
- 26   1  1d98  DDEENABLECALLBACK exported, shared data
- 27   1  1ed4  DDENAMESERVICE exported, shared data
- 28   1  4614  CLIENTWNDPROC exported, shared data
- 29   1  523a  SERVERWNDPROC exported, shared data
- 30   1  5480  SUBFRAMEWNDPROC exported, shared data
- 31   1  5558  DMGWNDPROC exported, shared data
- 32   1  5758  CONVLISTWNDPROC exported, shared data
- 33   1  35f2  MONITORWNDPROC exported, shared data
- 34   1  2fb0  DDESENDHOOKPROC exported, shared data
- 35   1  309e  DDEPOSTHOOKPROC exported, shared data
- 36   1  1bb0  DDECMPSTRINGHANDLES exported, shared data
- 37   1  0be0  DDERECONNECT exported, shared data
- 38   1  6b8a  INITENUM exported, shared data
- 39   1  036a  TERMDLGPROC exported, shared data
diff --git a/etc/gdi-ordinals b/etc/gdi-ordinals
deleted file mode 100644
index 55fcf49..0000000
--- a/etc/gdi-ordinals
+++ /dev/null
@@ -1,283 +0,0 @@
-  1   1  4e0c  SETBKCOLOR exported, shared data
-  2   1  4e22  SETBKMODE exported
-  3   1  4b46  SETMAPMODE exported, shared data
-  4   1  4e6b  SETROP2 exported
-  5   1  5218  SETRELABS exported
-  6   1  4eb9  SETPOLYFILLMODE exported
-  7   1  4e92  SETSTRETCHBLTMODE exported
-  8   1  4a00  SETTEXTCHARACTEREXTRA exported, shared data
-  9   1  4df8  SETTEXTCOLOR exported, shared data
- 10   1  49ec  SETTEXTJUSTIFICATION exported, shared data
- 11   1  4ee0  SETWINDOWORG exported, shared data
- 12   4  06c8  SETWINDOWEXT exported
- 13   1  4f14  SETVIEWPORTORG exported, shared data
- 14   4  06fc  SETVIEWPORTEXT exported
- 15   1  4b12  OFFSETWINDOWORG exported
- 16   4  0764  SCALEWINDOWEXT exported
- 17   1  4ade  OFFSETVIEWPORTORG exported
- 18   4  0730  SCALEVIEWPORTEXT exported
- 19  21  0e96  LINETO exported, shared data
- 20  21  0eaa  MOVETO exported, shared data
- 21   1  4c50  EXCLUDECLIPRECT exported
- 22   1  4c84  INTERSECTCLIPRECT exported
- 23   9  1030  ARC exported, shared data
- 24   9  101c  ELLIPSE exported, shared data
- 25  15  08fc  FLOODFILL exported, shared data
- 26   9  1044  PIE exported, shared data
- 27  25  0000  RECTANGLE exported, shared data
- 28   9  106c  ROUNDRECT exported, shared data
- 29   1  4c14  PATBLT exported, shared data
- 30   1  48cb  SAVEDC exported, shared data
- 31  23  0383  SETPIXEL exported, shared data
- 32   1  4d3a  OFFSETCLIPRGN exported, shared data
- 33   1  4f95  TEXTOUT exported, shared data
- 34   1  4bfa  BITBLT exported, shared data
- 35   1  4be0  STRETCHBLT exported, shared data
- 36  24  0000  POLYGON exported, shared data
- 37  21  0ede  POLYLINE exported, shared data
- 38   7  06d1  ESCAPE exported, shared data
- 39   1  48b7  RESTOREDC exported, shared data
- 40  26  0000  FILLRGN exported, shared data
- 41  26  003a  FRAMERGN exported, shared data
- 42   1  4dbd  INVERTRGN exported, shared data
- 43  26  0020  PAINTRGN exported, shared data
- 44   1  4c98  SELECTCLIPRGN exported, shared data
- 45   1  4dd7  SELECTOBJECT exported, shared data
- 46   1  79f4  __GP exported, shared data
- 47   1  4d4e  COMBINERGN exported, shared data
- 48   1  4929  CREATEBITMAP exported, shared data
- 49   1  4943  CREATEBITMAPINDIRECT exported, shared data
- 50   4  05d7  CREATEBRUSHINDIRECT exported, shared data
- 51   4  05f1  CREATECOMPATIBLEBITMAP exported
- 52   1  47c4  CREATECOMPATIBLEDC exported, shared data
- 53   1  480a  CREATEDC exported
- 54   9  020e  CREATEELLIPTICRGN exported, shared data
- 55   9  0f99  CREATEELLIPTICRGNINDIRECT exported, shared data
- 56   3  1589  CREATEFONT exported, shared data
- 57   3  15b1  CREATEFONTINDIRECT exported, shared data
- 58   4  05a7  CREATEHATCHBRUSH exported, shared data
- 59   1  1ec0  WEP exported, shared data
- 60   4  05c3  CREATEPATTERNBRUSH exported, shared data
- 61   1  48f3  CREATEPEN exported, shared data
- 62   1  490f  CREATEPENINDIRECT exported, shared data
- 63   9  0fb3  CREATEPOLYGONRGN exported, shared data
- 64   1  59cd  CREATERECTRGN exported, shared data
- 65   1  4cb2  CREATERECTRGNINDIRECT exported, shared data
- 66   4  017a  CREATESOLIDBRUSH exported, shared data
- 67   1  4a14  DPTOLP exported
- 68   1  4897  DELETEDC exported, shared data
- 69   1  48df  DELETEOBJECT exported, shared data
- 70   5  05a7  ENUMFONTS exported, shared data
- 71   4  0678  ENUMOBJECTS exported, shared data
- 72   1  4ccc  EQUALRGN exported, shared data
- 73   1  16a5  EXCLUDEVISRECT exported
- 74   1  4a76  GETBITMAPBITS exported
- 75   1  515d  GETBKCOLOR exported, shared data
- 76   1  5142  GETBKMODE exported
- 77   1  4c64  GETCLIPBOX exported, shared data
- 78   1  5157  GETCURRENTPOSITION exported
- 79   1  5154  GETDCORG exported
- 80   1  4a96  GETDEVICECAPS exported, shared data
- 81   1  513f  GETMAPMODE exported
- 82   4  06a8  GETOBJECT exported, shared data
- 83  23  036f  GETPIXEL exported, shared data
- 84   1  5139  GETPOLYFILLMODE exported
- 85   1  5133  GETROP2 exported
- 86   1  5145  GETRELABS exported
- 87   1  4a5a  GETSTOCKOBJECT exported, shared data
- 88   1  513c  GETSTRETCHBLTMODE exported
- 89  16  0c63  GETTEXTCHARACTEREXTRA exported, shared data
- 90   1  5160  GETTEXTCOLOR exported, shared data
- 91   1  4b8d  GETTEXTEXTENT exported, shared data
- 92   3  166a  GETTEXTFACE exported, shared data
- 93   3  169a  GETTEXTMETRICS exported, shared data
- 94   1  5151  GETVIEWPORTEXT exported
- 95   1  514b  GETVIEWPORTORG exported
- 96   1  514e  GETWINDOWEXT exported
- 97   1  5148  GETWINDOWORG exported
- 98   1  16a2  INTERSECTVISRECT exported
- 99   1  4a37  LPTODP exported
-100  23  039b  LINEDDA exported, shared data
-101   1  4d26  OFFSETRGN exported, shared data
-102   1  2929  OFFSETVISRGN exported, shared data
-103   1  4da9  PTVISIBLE exported, shared data
-104   1  4d06  RECTVISIBLE exported, shared data
-105   1  1635  SELECTVISRGN exported, shared data
-106   1  4aaa  SETBITMAPBITS exported
-117   1  1118  SETDCORG exported, shared data
-119   2  0e25  ADDFONTRESOURCE exported, shared data
-121   1  2067  DEATH exported, shared data
-122   1  208e  RESURRECTION exported, shared data
-123  19  1603  PLAYMETAFILE exported, shared data
-124  19  1624  GETMETAFILE exported, shared data
-125  20  248b  CREATEMETAFILE exported, shared data
-126  20  24a5  CLOSEMETAFILE exported, shared data
-127  19  15ef  DELETEMETAFILE exported, shared data
-128   1  41b0  MULDIV exported, shared data
-129   1  076c  SAVEVISRGN exported, shared data
-130   1  07b2  RESTOREVISRGN exported, shared data
-131   1  200a  INQUIREVISRGN exported, shared data
-132   7  073d  SETENVIRONMENT exported, shared data
-133   7  0707  GETENVIRONMENT exported, shared data
-134   1  4b6d  GETRGNBOX exported, shared data
-135  15  087f  SCANLR exported, shared data
-136   6  0507  REMOVEFONTRESOURCE exported, shared data
-148   1  4c28  SETBRUSHORG exported, shared data
-149   1  515a  GETBRUSHORG exported
-150   1  4c3c  UNREALIZEOBJECT exported, shared data
-151  20  246b  COPYMETAFILE exported, shared data
-153   1  47d8  CREATEIC exported
-154   1  4aca  GETNEARESTCOLOR exported, shared data
-155   7  052d  QUERYABORT exported, shared data
-156   4  0605  CREATEDISCARDABLEBITMAP exported
-159  20  24b9  GETMETAFILEBITS exported, shared data
-160  20  24cd  SETMETAFILEBITS exported, shared data
-161   1  4d95  PTINREGION exported, shared data
-162   1  49b8  GETBITMAPDIMENSION exported, shared data
-163   1  4984  SETBITMAPDIMENSION exported, shared data
-169   1  4352  ISDCDIRTY exported, shared data
-170   1  439b  SETDCSTATUS exported, shared data
-172   1  4d81  SETRECTRGN exported, shared data
-173   1  5130  GETCLIPRGN exported, shared data
-175  19  166a  ENUMMETAFILE exported, shared data
-176  19  163e  PLAYMETAFILERECORD exported, shared data
-179   1  0601  GETDCSTATE exported, shared data
-180   1  0615  SETDCSTATE exported, shared data
-181   1  4ce6  RECTINREGION exported, shared data
-190  31  04ec  SETDCHOOK exported, shared data
-191  31  04b5  GETDCHOOK exported, shared data
-192   1  76b0  SETHOOKFLAGS exported, shared data
-193  31  0526  SETBOUNDSRECT exported, shared data
-194   1  76e4  GETBOUNDSRECT exported, shared data
-195   1  1ac6  SELECTBITMAP exported, shared data
-196  20  24e1  SETMETAFILEBITSBETTER exported, shared data
-201  13  014a  DMBITBLT exported
-202  13  014f  DMCOLORINFO exported
-206  13  0163  DMENUMDFONTS exported
-207  13  0169  DMENUMOBJ exported
-208  13  0159  DMOUTPUT exported
-209  13  0154  DMPIXEL exported
-210  13  015e  DMREALIZEOBJECT exported
-211  13  00df  DMSTRBLT exported, shared data
-212  13  016e  DMSCANLR exported
-213  13  0171  BRUTE exported, shared data
-214  13  0000  DMEXTTEXTOUT exported, shared data
-215  13  0130  DMGETCHARWIDTH exported, shared data
-216  13  0136  DMSTRETCHBLT exported, shared data
-217  13  013b  DMDIBBITS exported, shared data
-218  13  0140  DMSTRETCHDIBITS exported, shared data
-219  13  0145  DMSETDIBTODEV exported, shared data
-220  13  024d  DMTRANSPOSE exported, shared data
-230  27  0000  CREATEPQ exported
-231  27  00fb  MINPQ exported
-232  27  00fe  EXTRACTPQ exported
-233  27  0045  INSERTPQ exported
-234  27  01dc  SIZEPQ exported
-235  27  01cb  DELETEPQ exported
-240  28  01c3  OPENJOB exported, shared data
-241  28  08eb  WRITESPOOL exported, shared data
-242  28  0e82  WRITEDIALOG exported, shared data
-243  28  1292  CLOSEJOB exported, shared data
-244  28  13e0  DELETEJOB exported, shared data
-245  28  1802  GETSPOOLJOB exported, shared data
-246  28  06a1  STARTSPOOLPAGE exported, shared data
-247  28  1112  ENDSPOOLPAGE exported, shared data
-248  28  18e4  QUERYJOB exported, shared data
-250  28  0000  COPY exported, shared data
-253  28  0ff3  DELETESPOOLPAGE exported, shared data
-254  28  156f  SPOOLFILE exported, shared data
-300   5  093c  ENGINEENUMERATEFONT exported, shared data
-301   6  0560  ENGINEDELETEFONT exported, shared data
-302   3  2b2d  ENGINEREALIZEFONT exported, shared data
-303   3  2c8a  ENGINEGETCHARWIDTH exported, shared data
-304   5  0993  ENGINESETFONTCONTEXT exported, shared data
-305   7  09e9  ENGINEGETGLYPHBMP exported, shared data
-306   7  1184  ENGINEMAKEFONTDIR exported, shared data
-307   7  083d  GETCHARABCWIDTHS exported, shared data
-308   7  0876  GETOUTLINETEXTMETRICS exported, shared data
-309   7  0795  GETGLYPHOUTLINE exported, shared data
-310   7  0763  CREATESCALABLEFONTRESOURCE exported, shared data
-311   7  07fc  GETFONTDATA exported, shared data
-312   7  0d8a  CONVERTOUTLINEFONTFILE exported, shared data
-313   7  0d36  GETRASTERIZERCAPS exported, shared data
-314   1  669a  ENGINEEXTTEXTOUT exported, shared data
-330   5  05d7  ENUMFONTFAMILIES exported, shared data
-332   7  0896  GETKERNINGPAIRS exported, shared data
-345   1  5136  GETTEXTALIGN exported, shared data
-346   1  4e49  SETTEXTALIGN exported, shared data
-348   9  1058  CHORD exported, shared data
-349   3  163f  SETMAPPERFLAGS exported, shared data
-350   3  15cb  GETCHARWIDTH exported, shared data
-351   1  4f48  EXTTEXTOUT exported, shared data
-352   1  0a2e  GETPHYSICALFONTHANDLE exported, shared data
-353   3  160b  GETASPECTRATIOFILTER exported, shared data
-354   1  1fdf  SHRINKGDIHEAP exported, shared data
-355  48  02ef  FTRAPPING0 exported, shared data
-360  22  0023  CREATEPALETTE exported, shared data
-361  22  0271  GDISELECTPALETTE exported, shared data
-362  22  1088  GDIREALIZEPALETTE exported, shared data
-363  22  0050  GETPALETTEENTRIES exported, shared data
-364  22  00d2  SETPALETTEENTRIES exported, shared data
-365  22  101d  REALIZEDEFAULTPALETTE exported, shared data
-366  22  0109  UPDATECOLORS exported, shared data
-367  22  0000  ANIMATEPALETTE exported, shared data
-368  22  00be  RESIZEPALETTE exported, shared data
-370  22  0073  GETNEARESTPALETTEINDEX exported, shared data
-372  15  0910  EXTFLOODFILL exported, shared data
-373  22  00f5  SETSYSTEMPALETTEUSE exported, shared data
-374  22  00aa  GETSYSTEMPALETTEUSE exported, shared data
-375  22  0087  GETSYSTEMPALETTEENTRIES exported, shared data
-376  31  009c  RESETDC exported, shared data
-377  31  0045  STARTDOC exported, shared data
-378  31  002e  ENDDOC exported, shared data
-379  31  0068  STARTPAGE exported, shared data
-380  31  0017  ENDPAGE exported, shared data
-381  31  007c  SETABORTPROC exported, shared data
-382  31  0000  ABORTDOC exported, shared data
-400   1  420e  FASTWINDOWFRAME exported, shared data
-401   2  0403  GDIMOVEBITMAP exported, shared data
-403   2  042a  GDIINIT2 exported, shared data
-405   2  012e  FINALGDIINIT exported, shared data
-407   1  0ec1  CREATEUSERBITMAP exported
-409   4  0200  CREATEUSERDISCARDABLEBITMAP exported
-410  19  1490  ISVALIDMETAFILE exported, shared data
-411   1  511a  GETCURLOGFONT exported, shared data
-412  22  0b0c  ISDCCURRENTPALETTE exported, shared data
-439  11  0202  STRETCHDIBITS exported, shared data
-440  11  0000  SETDIBITS exported, shared data
-441  11  0196  GETDIBITS exported, shared data
-442  11  006c  CREATEDIBITMAP exported, shared data
-443  11  010a  SETDIBITSTODEVICE exported, shared data
-444   9  01be  CREATEROUNDRECTRGN exported, shared data
-445   4  0619  CREATEDIBPATTERNBRUSH exported, shared data
-449  11  1015  DEVICECOLORMATCH exported, shared data
-450  24  0023  POLYPOLYGON exported, shared data
-451   9  0fe3  CREATEPOLYPOLYGONRGN exported, shared data
-452  21  19a0  GDISEEGDIDO exported, shared data
-460   1  7690  GDITASKTERMINATION exported, shared data
-461   1  76a2  SETOBJECTOWNER exported, shared data
-462   1  1ec6  ISGDIOBJECT exported, shared data
-463   1  0e68  MAKEOBJECTPRIVATE exported, shared data
-464  19  1862  FIXUPBOGUSPUBLISHERMETAFILE exported, shared data
-465   1  29b7  RECTVISIBLE_EHH exported, shared data
-466   1  2aab  RECTINREGION_EHH exported, shared data
-467   1  56a3  UNICODETOANSI exported, shared data
-468   1  49cc  GETBITMAPDIMENSIONEX exported, shared data
-469   1  5eb5  GETBRUSHORGEX exported
-470   1  5ed8  GETCURRENTPOSITIONEX exported
-471   1  4bb4  GETTEXTEXTENTPOINT exported, shared data
-472   1  5f27  GETVIEWPORTEXTEX exported
-473   1  5f4a  GETVIEWPORTORGEX exported
-474   1  5f6d  GETWINDOWEXTEX exported
-475   1  5f90  GETWINDOWORGEX exported
-476   1  4af2  OFFSETVIEWPORTORGEX exported
-477   1  4b26  OFFSETWINDOWORGEX exported
-478   1  4998  SETBITMAPDIMENSIONEX exported, shared data
-479   4  0710  SETVIEWPORTEXTEX exported
-480   1  4f28  SETVIEWPORTORGEX exported, shared data
-481   4  06dc  SETWINDOWEXTEX exported
-482   1  4ef4  SETWINDOWORGEX exported, shared data
-483  21  0ebe  MOVETOEX exported, shared data
-484   4  0744  SCALEVIEWPORTEXTEX exported
-485   4  0778  SCALEWINDOWEXTEX exported
-486   3  161f  GETASPECTRATIOFILTEREX exported, shared data
diff --git a/etc/kernel-ordinals b/etc/kernel-ordinals
deleted file mode 100644
index f3ad91d..0000000
--- a/etc/kernel-ordinals
+++ /dev/null
@@ -1,233 +0,0 @@
-  1   1  93ce  FATALEXIT exported, shared data
-  2   1  9d6f  EXITKERNEL exported
-  3   3  07c6  GETVERSION exported
-  4   2  28b7  LOCALINIT exported
-  5   1  0543  LOCALALLOC exported
-  6   1  0587  LOCALREALLOC exported
-  7   1  055f  LOCALFREE exported
-  8   1  0573  LOCALLOCK exported
-  9   1  05bd  LOCALUNLOCK exported
- 10   1  05a9  LOCALSIZE exported
- 11   1  8d6a  LOCALHANDLE exported
- 12   1  05d1  LOCALFLAGS exported
- 13   1  8d85  LOCALCOMPACT exported
- 14   2  0278  LOCALNOTIFY exported
- 15   1  022b  GLOBALALLOC exported
- 16   1  028c  GLOBALREALLOC exported
- 17   1  0247  GLOBALFREE exported
- 18   1  0278  GLOBALLOCK exported
- 19   1  02cb  GLOBALUNLOCK exported
- 20   1  02b7  GLOBALSIZE exported
- 21   1  0264  GLOBALHANDLE exported
- 22   1  02e8  GLOBALFLAGS exported
- 23   1  03b3  LOCKSEGMENT exported
- 24   1  03c7  UNLOCKSEGMENT exported
- 25   1  1105  GLOBALCOMPACT exported
- 26   1  0e39  GLOBALFREEALL exported
- 28   1  1190  GLOBALMASTERHANDLE exported
- 29   1  7d21  YIELD exported
- 30   1  7ca8  WAITEVENT exported
- 31   1  7d92  POSTEVENT exported
- 32   1  7df0  SETPRIORITY exported
- 33   1  81e5  LOCKCURRENTTASK exported
- 34   1  7de3  SETTASKQUEUE exported
- 35   1  7d9d  GETTASKQUEUE exported
- 36   1  842c  GETCURRENTTASK exported
- 37   3  024e  GETCURRENTPDB exported
- 38   1  7dc5  SETTASKSIGNALPROC exported
- 41   1  9c8e  ENABLEDOS exported
- 42   1  9c8f  DISABLEDOS exported
- 45   2  0244  LOADMODULE exported
- 46   2  0176  FREEMODULE exported
- 47   2  01bb  GETMODULEHANDLE exported
- 48   2  01d2  GETMODULEUSAGE exported
- 49   2  01e6  GETMODULEFILENAME exported
- 50   2  019e  GETPROCADDRESS exported
- 51   3  00a8  MAKEPROCINSTANCE exported
- 52   3  00c5  FREEPROCINSTANCE exported
- 53   1  4927  CALLPROCINSTANCE exported
- 54   2  0219  GETINSTANCEDATA exported
- 55   3  08ee  CATCH exported
- 56   3  0928  THROW exported
- 57   1  0663  GETPROFILEINT exported, shared data
- 58   1  0689  GETPROFILESTRING exported, shared data
- 59   1  0763  WRITEPROFILESTRING exported, shared data
- 60   3  0008  FINDRESOURCE exported
- 61   1  0126  LOADRESOURCE exported
- 62   1  018b  LOCKRESOURCE exported
- 63   1  0177  FREERESOURCE exported
- 64   1  0140  ACCESSRESOURCE exported
- 65   1  019f  SIZEOFRESOURCE exported
- 66   1  015d  ALLOCRESOURCE exported
- 67   3  002e  SETRESOURCEHANDLER exported
- 68   3  041a  INITATOMTABLE exported
- 69   1  4942  FINDATOM exported
- 70   1  493f  ADDATOM exported
- 71   1  01b9  DELETEATOM exported
- 72   1  01cd  GETATOMNAME exported
- 73   1  01fd  GETATOMHANDLE exported
- 74   1  05e5  OPENFILE exported
- 75   3  04be  OPENPATHNAME exported
- 76   3  04b6  DELETEPATHNAME exported
- 77   1  83cd  RESERVED1 exported
- 78   1  83ca  RESERVED2 exported
- 79   1  83c4  RESERVED3 exported
- 80   1  83c7  RESERVED4 exported
- 81   1  046e  _LCLOSE exported
- 82   1  04e6  _LREAD exported
- 83   1  048d  _LCREAT exported
- 84   1  04b8  _LLSEEK exported
- 85   1  0443  _LOPEN exported
- 86   1  0516  _LWRITE exported
- 87   1  838e  RESERVED5 exported
- 88   1  836f  LSTRCPY exported
- 89   1  837f  LSTRCAT exported
- 90   1  82f6  LSTRLEN exported
- 91   2  268d  INITTASK exported
- 92   3  0508  GETTEMPDRIVE exported
- 93   1  48fa  GETCODEHANDLE exported
- 94   3  03ce  DEFINEHANDLETABLE exported
- 95   2  022d  LOADLIBRARY exported
- 96   2  018a  FREELIBRARY exported
- 97   3  00dc  GETTEMPFILENAME exported
- 98   1  5c17  GETLASTDISKCHANGE exported
- 99   1  0bc5  GETLPERRMODE exported
-100   2  2ab7  VALIDATECODESEGMENTS exported
-101   1  1d92  NOHOOKDOSCALL exported
-102   1  1d98  DOS3CALL exported
-103   1  9e19  NETBIOSCALL exported
-104   1  03db  GETCODEINFO exported
-105   3  07d9  GETEXEVERSION exported
-106   1  2ede  SETSWAPAREASIZE exported
-107   3  0132  SETERRORMODE exported
-108   1  11c6  SWITCHSTACKTO exported
-109   1  123c  SWITCHSTACKBACK exported
-110   1  7bac  PATCHCODEHANDLE exported
-111   1  02fc  GLOBALWIRE exported
-112   1  0310  GLOBALUNWIRE exported
-113 254  0003  __AHSHIFT exported
-114 254  0008  __AHINCR exported
-115   1  999b  OUTPUTDEBUGSTRING exported
-116   2  2797  INITLIB exported
-117   1  7d3e  OLDYIELD exported
-118   1  7da7  GETTASKQUEUEDS exported
-119   1  7db5  GETTASKQUEUEES exported
-120   1  72d4  UNDEFDYNLINK exported
-121   1  8db0  LOCALSHRINK exported
-122   1  81ff  ISTASKLOCKED exported
-123   1  4638  KBDRST exported
-124   1  9c90  ENABLEKERNEL exported
-125   1  9c91  DISABLEKERNEL exported
-126   1  2ea7  MEMORYFREED exported
-127   1  06d7  GETPRIVATEPROFILEINT exported, shared data
-128   1  0709  GETPRIVATEPROFILESTRING exported, shared data
-129   1  0795  WRITEPRIVATEPROFILESTRING exported, shared data
-130   3  0888  FILECDR exported
-131   3  08ce  GETDOSENVIRONMENT exported
-132   3  07ab  GETWINFLAGS exported
-133   1  4e78  GETEXEPTR exported
-134   3  0054  GETWINDOWSDIRECTORY exported
-135   3  007e  GETSYSTEMDIRECTORY exported
-136   3  0675  GETDRIVETYPE exported
-137   1  0211  FATALAPPEXIT exported
-138   2  1e4d  GETHEAPSPACES exported
-139   1  612c  DOSIGNAL exported
-140   3  068c  SETSIGHANDLER exported
-141   1  8014  INITTASK1 exported
-150   1  7cff  DIRECTEDYIELD exported
-151   3  07e6  WINOLDAPCALL exported
-152   3  08e2  GETNUMTASKS exported
-154   1  034c  GLOBALNOTIFY exported
-155   1  119f  GETTASKDS exported
-156   1  4632  LIMITEMSPAGES exported
-157   1  4639  GETCURPID exported
-158   1  7e3e  ISWINOLDAPTASK exported
-159   1  0ec5  GLOBALHANDLENORIP exported
-160   1  a940  EMSCOPY exported
-161   2  29c9  LOCALCOUNTFREE exported
-162   2  2a01  LOCALHEAPSIZE exported
-163   1  0338  GLOBALLRUOLDEST exported
-164   1  0324  GLOBALLRUNEWEST exported
-165   1  9e0c  A20PROC exported
-166   2  028f  WINEXEC exported
-167   1  4f02  GETEXPWINVER exported
-168   1  84b8  DIRECTRESALLOC exported
-169   1  0404  GETFREESPACE exported
-170   1  00d0  ALLOCCSTODSALIAS exported
-171   1  00e4  ALLOCDSTOCSALIAS exported
-172   1  21fb  ALLOCALIAS exported
-173 254  f000  __ROMBIOS exported
-174 254  a000  __A000H exported
-175   1  1d9e  ALLOCSELECTOR exported
-176   1  00f8  FREESELECTOR exported
-177   1  010c  PRESTOCHANGOSELECTOR exported
-178 254  0001  __WINFLAGS exported
-179 254  d000  __D000H exported
-180   1  26b9  LONGPTRADD exported
-181 254  b000  __B000H exported
-182 254  b800  __B800H exported
-183 254  0000  __0000H exported
-184   1  139a  GLOBALDOSALLOC exported
-185   1  13d4  GLOBALDOSFREE exported
-186   1  2252  GETSELECTORBASE exported
-187   1  2725  SETSELECTORBASE exported
-188   1  2755  GETSELECTORLIMIT exported
-189   1  276d  SETSELECTORLIMIT exported
-190 254  e000  __E000H exported
-191   1  0363  GLOBALPAGELOCK exported
-192   1  0377  GLOBALPAGEUNLOCK exported
-193 254  0040  __0040H exported
-194 254  f000  __F000H exported
-195 254  c000  __C000H exported
-196   1  279b  SELECTORACCESSRIGHTS exported
-197   1  038b  GLOBALFIX exported
-198   1  039f  GLOBALUNFIX exported
-199   1  0647  SETHANDLECOUNT exported
-200   1  3e4e  VALIDATEFREESPACES exported
-201   1  9ada  REPLACEINST exported
-202   3  081d  REGISTERPTRACE exported
-203   1  946e  DEBUGBREAK exported
-204   3  014e  SWAPRECORDING exported
-205   1  97e0  CVWBREAK exported
-206   1  1df5  ALLOCSELECTORARRAY exported
-207   1  8425  ISDBCSLEADBYTE exported
-310   2  2a0c  LOCALHANDLEDELTA exported
-311   1  9eaf  GETSETKERNELDOSPROC exported
-314   1  9835  DEBUGDEFINESEGMENT exported
-315   1  708b  WRITEOUTPROFILES exported, shared data
-316   1  127e  GETFREEMEMINFO exported
-318   1  9ecf  FATALEXITHOOK exported
-319   1  52fc  FLUSHCACHEDFILEHANDLE exported
-320   1  7e50  ISTASK exported
-323   2  1e9b  ISROMMODULE exported
-324   1  94cf  LOGERROR exported, shared data
-325   1  94f2  LOGPARAMERROR exported, shared data
-326   2  1ea0  ISROMFILE exported
-327   1  949b  K327 exported
-328   1  94ce  _DEBUGOUTPUT exported
-329   1  94c5  K329 exported
-332   4  0218  THHOOK exported
-334   1  4b62  ISBADREADPTR exported
-335   1  4b83  ISBADWRITEPTR exported
-336   1  4c28  ISBADCODEPTR exported
-337   1  4c4e  ISBADSTRINGPTR exported
-338   1  4c72  HASGPHANDLER exported
-339   1  a70e  DIAGQUERY exported
-340   1  a71d  DIAGOUTPUT exported
-341   3  084c  TOOLHELPHOOK exported
-342   1  a820  __GP exported, shared data
-343   2  0689  REGISTERWINOLDAPHOOK exported
-344   2  06f3  GETWINOLDAPHOOKS exported
-345   1  4d39  ISSHAREDSELECTOR exported
-346   1  4ba5  ISBADHUGEREADPTR exported
-347   1  4be5  ISBADHUGEWRITEPTR exported
-348   1  4d5c  HMEMCPY exported
-349   1  4dec  _HREAD exported
-350   1  4df1  _HWRITE exported
-351   1  5e92  BUNNY_351 exported
-353   1  831f  LSTRCPYN exported
-354   1  9eeb  GETAPPCOMPATFLAGS exported
-355   1  9f2a  GETWINDEBUGINFO exported, shared data
-356   1  9f36  SETWINDEBUGINFO exported, shared data
-403   1  29f1  K403 exported
-404   1  29ae  K404 exported
diff --git a/etc/lzexpand-ordinals b/etc/lzexpand-ordinals
deleted file mode 100644
index 803da95..0000000
--- a/etc/lzexpand-ordinals
+++ /dev/null
@@ -1,12 +0,0 @@
-  1   4  015c  LZCOPY exported, shared data
-  2   2  0262  LZOPENFILE exported, shared data
-  3   2  0000  LZINIT exported, shared data
-  4   2  02ee  LZSEEK exported, shared data
-  5   2  03d6  LZREAD exported, shared data
-  6   2  06f0  LZCLOSE exported, shared data
-  7   4  0000  LZSTART exported, shared data
-  8   4  013a  COPYLZFILE exported, shared data
-  9   4  00a6  LZDONE exported, shared data
- 10   2  01bc  GETEXPANDEDNAME exported, shared data
- 11   3  0000  WEP exported, shared data
- 12  11  035e  ___EXPORTEDSTUB exported, shared data
diff --git a/etc/mmsystem-ordinals b/etc/mmsystem-ordinals
deleted file mode 100644
index 6f0a268..0000000
--- a/etc/mmsystem-ordinals
+++ /dev/null
@@ -1,136 +0,0 @@
-  1   2  0014  WEP exported, shared data
-  2   4  0000  SNDPLAYSOUND exported, shared data
-  5   2  02b0  MMSYSTEMGETVERSION exported, shared data
-  6   4  0028  DRIVERPROC exported, shared data
- 30   1  030a  OUTPUTDEBUGSTR exported, shared data
- 31   1  03ab  DRIVERCALLBACK exported, shared data
- 32   1  0312  STACKENTER exported, shared data
- 33   1  0370  STACKLEAVE exported, shared data
- 34   2  0484  MMDRVINSTALL exported, shared data
-101   8  005d  JOYGETNUMDEVS exported, shared data
-102   8  001a  JOYGETDEVCAPS exported, shared data
-103   8  0073  JOYGETPOS exported, shared data
-104   8  00b5  JOYGETTHRESHOLD exported, shared data
-105   8  00ec  JOYRELEASECAPTURE exported, shared data
-106   8  013e  JOYSETCAPTURE exported, shared data
-107   8  021d  JOYSETTHRESHOLD exported, shared data
-109   8  0251  JOYSETCALIBRATION exported, shared data
-1100   4  057e  DRVOPEN exported, shared data
-1101   4  0583  DRVCLOSE exported, shared data
-1102   4  058d  DRVSENDMESSAGE exported, shared data
-1103   4  0588  DRVGETMODULEHANDLE exported, shared data
-1104   4  0592  DRVDEFDRIVERPROC exported, shared data
-1210   7  02a5  MMIOOPEN exported, shared data
-1211   7  0457  MMIOCLOSE exported, shared data
-1212   7  04b4  MMIOREAD exported, shared data
-1213   7  062b  MMIOWRITE exported, shared data
-1214   7  07e9  MMIOSEEK exported, shared data
-1215   7  0929  MMIOGETINFO exported, shared data
-1216   7  0996  MMIOSETINFO exported, shared data
-1217   7  0a68  MMIOSETBUFFER exported, shared data
-1218   7  0cd8  MMIOFLUSH exported, shared data
-1219   7  0da7  MMIOADVANCE exported, shared data
-1220   7  0ed3  MMIOSTRINGTOFOURCC exported, shared data
-1221   7  0f6e  MMIOINSTALLIOPROC exported, shared data
-1222   7  1073  MMIOSENDMESSAGE exported, shared data
-1223   7  1360  MMIODESCEND exported, shared data
-1224   7  1562  MMIOASCEND exported, shared data
-1225   7  16a5  MMIOCREATECHUNK exported, shared data
-1226   7  01d2  MMIORENAME exported, shared data
-201   6  015f  MIDIOUTGETNUMDEVS exported, shared data
-202   6  016a  MIDIOUTGETDEVCAPS exported, shared data
-203   6  0266  MIDIOUTGETERRORTEXT exported, shared data
-204   6  02a7  MIDIOUTOPEN exported, shared data
-205   6  03c4  MIDIOUTCLOSE exported, shared data
-206   6  0410  MIDIOUTPREPAREHEADER exported, shared data
-207   6  0485  MIDIOUTUNPREPAREHEADER exported, shared data
-208   1  0121  MIDIOUTSHORTMSG exported, shared data
-209   1  0156  MIDIOUTLONGMSG exported, shared data
-210   1  01b4  MIDIOUTRESET exported, shared data
-211   6  01b6  MIDIOUTGETVOLUME exported, shared data
-212   6  01f7  MIDIOUTSETVOLUME exported, shared data
-213   6  04ff  MIDIOUTCACHEPATCHES exported, shared data
-214   6  0571  MIDIOUTCACHEDRUMPATCHES exported, shared data
-215   6  0a5c  MIDIOUTGETID exported, shared data
-216   1  00eb  MIDIOUTMESSAGE exported, shared data
-301   6  05e3  MIDIINGETNUMDEVS exported, shared data
-302   6  0625  MIDIINGETDEVCAPS exported, shared data
-303   6  0671  MIDIINGETERRORTEXT exported, shared data
-304   6  06b2  MIDIINOPEN exported, shared data
-305   6  07cf  MIDIINCLOSE exported, shared data
-306   6  081b  MIDIINPREPAREHEADER exported, shared data
-307   6  0890  MIDIINUNPREPAREHEADER exported, shared data
-308   6  090a  MIDIINADDBUFFER exported, shared data
-309   6  0976  MIDIINSTART exported, shared data
-310   6  09aa  MIDIINSTOP exported, shared data
-311   6  09de  MIDIINRESET exported, shared data
-312   6  0a12  MIDIINGETID exported, shared data
-313   6  05ee  MIDIINMESSAGE exported, shared data
-350   8  0531  AUXGETNUMDEVS exported, shared data
-351   8  053c  AUXGETDEVCAPS exported, shared data
-352   8  0582  AUXGETVOLUME exported, shared data
-353   8  05bd  AUXSETVOLUME exported, shared data
-354   8  04df  AUXOUTMESSAGE exported, shared data
-401   3  0866  WAVEOUTGETNUMDEVS exported, shared data
-402   3  08a6  WAVEOUTGETDEVCAPS exported, shared data
-403   3  09a2  WAVEOUTGETERRORTEXT exported, shared data
-404   3  09e3  WAVEOUTOPEN exported, shared data
-405   3  0b81  WAVEOUTCLOSE exported, shared data
-406   3  0bc8  WAVEOUTPREPAREHEADER exported, shared data
-407   3  0c54  WAVEOUTUNPREPAREHEADER exported, shared data
-408   3  0cdd  WAVEOUTWRITE exported, shared data
-409   3  0d4a  WAVEOUTPAUSE exported, shared data
-410   3  0d7c  WAVEOUTRESTART exported, shared data
-411   3  0dae  WAVEOUTRESET exported, shared data
-412   3  0e12  WAVEOUTGETPOSITION exported, shared data
-413   3  0e62  WAVEOUTGETPITCH exported, shared data
-414   3  0eb0  WAVEOUTSETPITCH exported, shared data
-415   3  08f2  WAVEOUTGETVOLUME exported, shared data
-416   3  0933  WAVEOUTSETVOLUME exported, shared data
-417   3  0ee4  WAVEOUTGETPLAYBACKRATE exported, shared data
-418   3  0f32  WAVEOUTSETPLAYBACKRATE exported, shared data
-419   3  0de0  WAVEOUTBREAKLOOP exported, shared data
-420   3  14bf  WAVEOUTGETID exported, shared data
-421   3  0871  WAVEOUTMESSAGE exported, shared data
-501   3  0f66  WAVEINGETNUMDEVS exported, shared data
-502   3  0fa6  WAVEINGETDEVCAPS exported, shared data
-503   3  0ff2  WAVEINGETERRORTEXT exported, shared data
-504   3  1033  WAVEINOPEN exported, shared data
-505   3  11d1  WAVEINCLOSE exported, shared data
-506   3  1218  WAVEINPREPAREHEADER exported, shared data
-507   3  129c  WAVEINUNPREPAREHEADER exported, shared data
-508   3  1325  WAVEINADDBUFFER exported, shared data
-509   3  138f  WAVEINSTART exported, shared data
-510   3  13c1  WAVEINSTOP exported, shared data
-511   3  13f3  WAVEINRESET exported, shared data
-512   3  1425  WAVEINGETPOSITION exported, shared data
-513   3  1475  WAVEINGETID exported, shared data
-514   3  0f71  WAVEINMESSAGE exported, shared data
-601   1  0000  TIMEGETSYSTEMTIME exported, shared data
-602   1  0029  TIMESETEVENT exported, shared data
-603   1  0292  TIMEKILLEVENT exported, shared data
-604   8  0000  TIMEGETDEVCAPS exported, shared data
-605   1  0288  TIMEBEGINPERIOD exported, shared data
-606   1  028d  TIMEENDPERIOD exported, shared data
-607   1  029a  TIMEGETTIME exported, shared data
-701   5  04af  MCISENDCOMMAND exported, shared data
-702   5  1258  MCISENDSTRING exported, shared data
-703   5  1588  MCIGETDEVICEID exported, shared data
-704   5  3994  MCIPARSECOMMAND exported, shared data
-705   5  2d4c  MCILOADCOMMANDRESOURCE exported, shared data
-706   5  136f  MCIGETERRORSTRING exported, shared data
-707   5  2a1d  MCISETDRIVERDATA exported, shared data
-708   5  29d3  MCIGETDRIVERDATA exported, shared data
-710   5  2a6f  MCIDRIVERYIELD exported, shared data
-711   1  0275  MCIDRIVERNOTIFY exported, shared data
-712   5  1293  MCIEXECUTE exported, shared data
-713   5  2fb9  MCIFREECOMMANDRESOURCE exported, shared data
-714   5  2acd  MCISETYIELDPROC exported, shared data
-715   5  1454  MCIGETDEVICEIDFROMELEMENTID exported, shared data
-716   5  2b3c  MCIGETYIELDPROC exported, shared data
-717   5  15a5  MCIGETCREATORTASK exported, shared data
-900   4  05fa  MMTASKCREATE exported, shared data
-902   4  05be  MMTASKBLOCK exported, shared data
-903   1  0264  MMTASKSIGNAL exported, shared data
-904   4  05b9  MMGETCURRENTTASK exported, shared data
-905   4  0598  MMTASKYIELD exported, shared data
diff --git a/etc/netapi20-ordinals b/etc/netapi20-ordinals
deleted file mode 100644
index 3666511..0000000
--- a/etc/netapi20-ordinals
+++ /dev/null
@@ -1,146 +0,0 @@
-  1   3  0000  NETACCESSADD exported, shared data
-  2   3  0128  NETACCESSDEL exported, shared data
-  3   3  01ea  NETACCESSENUM exported, shared data
-  4   3  0318  NETACCESSGETINFO exported, shared data
-  5   3  042a  NETACCESSSETINFO exported, shared data
-  6   4  0030  NETALERTRAISE exported, shared data
-  7   4  0000  NETALERTSTART exported, shared data
-  8   4  0018  NETALERTSTOP exported, shared data
-  9  10  00f4  NETAUDITCLEAR exported, shared data
- 10  10  024a  NETAUDITOPEN exported, shared data
- 11  10  0000  NETAUDITWRITE exported, shared data
- 12   3  0110  NETACCESSCHECK exported, shared data
- 13  12  0000  NETBIOSCLOSE exported, shared data
- 14  12  0018  NETBIOSENUM exported, shared data
- 15  12  0030  NETBIOSGETINFO exported, shared data
- 16  12  0048  NETBIOSOPEN exported, shared data
- 17  12  0060  NETBIOSSUBMIT exported, shared data
- 18   7  0000  NETCHARDEVCONTROL exported, shared data
- 19   7  0056  NETCHARDEVENUM exported, shared data
- 20   7  00f2  NETCHARDEVGETINFO exported, shared data
- 21   7  016e  NETCHARDEVQENUM exported, shared data
- 22   7  043c  NETCHARDEVQGETINFO exported, shared data
- 23   7  04b2  NETCHARDEVQPURGE exported, shared data
- 24   7  0562  NETCHARDEVQSETINFO exported, shared data
- 25   6  0330  NETCONFIGGET exported, shared data
- 26   6  0150  NETCONFIGGETALL exported, shared data
- 27  18  0000  NETCONNECTIONENUM exported, shared data
- 28   1  00a8  WEP exported, shared data
- 29  10  0030  NETERRORLOGCLEAR exported, shared data
- 30  10  01c0  NETERRORLOGOPEN exported, shared data
- 31  10  0018  NETERRORLOGWRITE exported, shared data
- 32  18  0256  NETFILECLOSE exported, shared data
- 33  18  044a  NETFILEENUM exported, shared data
- 34  18  0516  NETFILEGETINFO exported, shared data
- 35   3  05f8  NETGROUPADD exported, shared data
- 36   3  067e  NETGROUPADDUSER exported, shared data
- 37   3  06dc  NETGROUPDEL exported, shared data
- 38   3  073a  NETGROUPDELUSER exported, shared data
- 39   3  0798  NETGROUPENUM exported, shared data
- 40   3  0894  NETGROUPGETUSERS exported, shared data
- 43  11  01cc  NETMESSAGELOGFILEGET exported, shared data
- 44  11  0338  NETMESSAGELOGFILESET exported, shared data
- 45  11  0718  NETMESSAGENAMEADD exported, shared data
- 46  11  0844  NETMESSAGENAMEDEL exported, shared data
- 47  11  096c  NETMESSAGENAMEENUM exported, shared data
- 48  11  0d2a  NETMESSAGENAMEFWD exported, shared data
- 49  11  0b00  NETMESSAGENAMEGETINFO exported, shared data
- 50  11  0d7a  NETMESSAGENAMEUNFWD exported, shared data
- 51  13  0000  NETPROFILELOAD exported, shared data
- 52  13  037e  NETPROFILESAVE exported, shared data
- 53  18  0b98  NETSERVERADMINCOMMAND exported, shared data
- 54  18  00b8  NETSERVERDISKENUM exported, shared data
- 55  18  0c62  NETSERVERGETINFO exported, shared data
- 56  18  0cf2  NETSERVERSETINFO exported, shared data
- 57  19  0134  NETSERVICECONTROL exported, shared data
- 58  19  02f0  NETSERVICEENUM exported, shared data
- 59  19  044a  NETSERVICEINSTALL exported, shared data
- 60  19  011c  NETSERVICESTATUS exported, shared data
- 61  18  0676  NETSESSIONDEL exported, shared data
- 62  18  05c4  NETSESSIONENUM exported, shared data
- 63  18  06dc  NETSESSIONGETINFO exported, shared data
- 64  18  0798  NETSHAREADD exported, shared data
- 65  18  0968  NETSHARECHECK exported, shared data
- 66  18  082a  NETSHAREDEL exported, shared data
- 67  18  09d6  NETSHAREENUM exported, shared data
- 68  18  0ab6  NETSHAREGETINFO exported, shared data
- 69  18  08a2  NETSHARESETINFO exported, shared data
- 70  18  0d88  NETSTATISTICSCLEAR exported, shared data
- 71  18  0de0  NETSTATISTICSGET exported, shared data
- 72  16  06f2  NETREMOTETOD exported, shared data
- 73  21  0000  NETUSEADD exported, shared data
- 74  21  032a  NETUSEDEL exported, shared data
- 75  21  0502  NETUSEENUM exported, shared data
- 76  21  0664  NETUSEGETINFO exported, shared data
- 77   3  0ab8  NETUSERADD exported, shared data
- 78   3  0c26  NETUSERDEL exported, shared data
- 79   3  0c84  NETUSERENUM exported, shared data
- 80   3  0f9a  NETUSERGETGROUPS exported, shared data
- 81   3  0ef4  NETUSERGETINFO exported, shared data
- 82   3  1132  NETUSERPASSWORDSET exported, shared data
- 83   3  0d2c  NETUSERSETINFO exported, shared data
- 84   9  0858  NETWKSTAGETINFO exported, shared data
- 85   9  0a22  NETWKSTASETINFO exported, shared data
- 86   9  0000  NETWKSTASETUID exported, shared data
- 91  16  0380  NETREMOTEMOVE exported, shared data
- 92  16  0000  NETREMOTECOPY exported, shared data
- 93  16  0368  NETREMOTEEXEC exported, shared data
-105   3  1570  NETUSERVALIDATE exported, shared data
-116  19  0000  NETSERVICEGETINFO exported, shared data
-117   7  050a  NETCHARDEVQPURGESELF exported, shared data
-172   3  0506  NETACCESSGETUSERPERMS exported, shared data
-174   7  0226  NETHANDLEGETINFO exported, shared data
-175   7  0326  NETHANDLESETINFO exported, shared data
-176   3  0974  NETGROUPSETUSERS exported, shared data
-177   3  0816  NETGROUPGETINFO exported, shared data
-178   3  08fe  NETGROUPSETINFO exported, shared data
-179   3  1404  NETUSERSETGROUPS exported, shared data
-182   3  1588  NETUSERVALIDATE2 exported, shared data
-184   3  1004  NETUSERMODALSGET exported, shared data
-185   3  10a2  NETUSERMODALSSET exported, shared data
-186   3  0d14  NETUSERINIT exported, shared data
-189  26  0000  NETGETDCNAME exported, shared data
-196   6  01e0  NETCONFIGGET2 exported, shared data
-197   6  0000  NETCONFIGGETALL2 exported, shared data
-198  18  0e5e  NETSTATISTICSGET2 exported, shared data
-199  10  02f4  NETERRORLOGREAD exported, shared data
-200  10  04b2  NETAUDITREAD exported, shared data
-201  18  02ae  NETFILEENUM2 exported, shared data
-259  17  0000  NETUSERRESTRICT exported, shared data
-266  26  06dc  NETLOGONENUM exported, shared data
-277   9  027c  NETWKSTASETUID2 exported, shared data
-280  18  0f9e  NETFILEGETINFO2 exported, shared data
-282  18  0f40  NETFILECLOSE2 exported, shared data
-299  25  0b34  I_NETPATHTYPE exported, shared data
-300  25  0000  I_NETPATHCANONICALIZE exported, shared data
-301  25  0932  I_NETPATHCOMPARE exported, shared data
-302  25  1afe  I_NETNAMEVALIDATE exported, shared data
-303  25  173e  I_NETNAMECANONICALIZE exported, shared data
-304  25  196e  I_NETNAMECOMPARE exported, shared data
-305  25  1cee  I_NETLISTCANONICALIZE exported, shared data
-306  25  22c2  I_NETLISTTRAVERSE exported, shared data
-501   8  0000  DOSDELETEMAILSLOT exported, shared data
-502   8  0072  DOSMAILSLOTINFO exported, shared data
-503   8  00ec  DOSMAKEMAILSLOT exported, shared data
-504   8  0320  DOSPEEKMAILSLOT exported, shared data
-523   8  0454  DOSREADMAILSLOT exported, shared data
-524   8  058a  DOSWRITEMAILSLOT exported, shared data
-525  11  0000  NETMESSAGEBUFFERSEND exported, shared data
-526  11  0e1e  NETMESSAGEFILESEND exported, shared data
-527   5  0000  NETSERVERENUM exported, shared data
-528   5  013a  NETSERVERENUM2 exported, shared data
-529  20  0000  NETSPECIALSMB exported, shared data
-530   2  0010  DOSMAKENMPIPE exported, shared data
-531   2  004c  DOSCONNECTNMPIPE exported, shared data
-532   2  002e  DOSDISCONNECTNMPIPE exported, shared data
-533   2  006a  DOSSETNMPHANDSTATE exported, shared data
-534   2  010a  DOSWAITNMPIPE exported, shared data
-535   2  01d2  DOSTRANSACTNMPIPE exported, shared data
-536   2  02e5  DOSQNMPHANDSTATE exported, shared data
-537   2  0388  DOSQNMPIPEINFO exported, shared data
-538   2  044d  DOSPEEKNMPIPE exported, shared data
-539   2  057d  DOSCALLNMPIPE exported, shared data
-540   2  06cf  DOSRAWREADNMPIPE exported, shared data
-541   2  07b6  DOSRAWWRITENMPIPE exported, shared data
-542   2  0b4f  DOSREADASYNCNMPIPE exported, shared data
-543   2  0d73  DOSWRITEASYNCNMPIPE exported, shared data
diff --git a/etc/olecli-ordinals b/etc/olecli-ordinals
deleted file mode 100644
index 2438fa1..0000000
--- a/etc/olecli-ordinals
+++ /dev/null
@@ -1,178 +0,0 @@
-  1   1  0000  WEP exported, shared data
-  2   3  004e  OLEDELETE exported, shared data
-  3   3  00c6  OLESAVETOSTREAM exported, shared data
-  4   3  0122  OLELOADFROMSTREAM exported, shared data
-  6   3  0400  OLECLONE exported, shared data
-  7   3  04ec  OLECOPYFROMLINK exported, shared data
-  8   3  0606  OLEEQUAL exported, shared data
-  9   3  0674  OLEQUERYLINKFROMCLIP exported, shared data
- 10   3  06a0  OLEQUERYCREATEFROMCLIP exported, shared data
- 11   3  06cc  OLECREATELINKFROMCLIP exported, shared data
- 12   3  08a2  OLECREATEFROMCLIP exported, shared data
- 13   3  0b52  OLECOPYTOCLIPBOARD exported, shared data
- 14   3  1d48  OLEQUERYTYPE exported, shared data
- 15   3  0b8e  OLESETHOSTNAMES exported, shared data
- 16   3  0c04  OLESETTARGETDEVICE exported, shared data
- 17   3  0c84  OLESETBOUNDS exported, shared data
- 18   3  0ce0  OLEQUERYBOUNDS exported, shared data
- 19   3  0da0  OLEDRAW exported, shared data
- 20   3  0e24  OLEQUERYOPEN exported, shared data
- 21   3  0e60  OLEACTIVATE exported, shared data
- 22   3  0eea  OLEUPDATE exported, shared data
- 23   3  0f26  OLERECONNECT exported, shared data
- 24   3  0f62  OLEGETLINKUPDATEOPTIONS exported, shared data
- 25   3  0fbe  OLESETLINKUPDATEOPTIONS exported, shared data
- 26   3  0ffc  OLEENUMFORMATS exported, shared data
- 27   3  0eae  OLECLOSE exported, shared data
- 28   3  107e  OLEGETDATA exported, shared data
- 29   3  10dc  OLESETDATA exported, shared data
- 30   3  0010  OLEQUERYPROTOCOL exported, shared data
- 31   3  111e  OLEQUERYOUTOFDATE exported, shared data
- 32   3  115a  OLEOBJECTCONVERT exported, shared data
- 33   3  121a  OLECREATEFROMTEMPLATE exported, shared data
- 34   3  13b4  OLECREATE exported, shared data
- 35   3  1ba6  OLEQUERYRELEASESTATUS exported, shared data
- 36   3  1c04  OLEQUERYRELEASEERROR exported, shared data
- 37   3  1c40  OLEQUERYRELEASEMETHOD exported, shared data
- 38   3  16fa  OLECREATEFROMFILE exported, shared data
- 39   3  190a  OLECREATELINKFROMFILE exported, shared data
- 40   3  008a  OLERELEASE exported, shared data
- 41   2  093e  OLEREGISTERCLIENTDOC exported, shared data
- 42   2  0a9e  OLEREVOKECLIENTDOC exported, shared data
- 43   2  0bb6  OLERENAMECLIENTDOC exported, shared data
- 44   2  0c8e  OLEREVERTCLIENTDOC exported, shared data
- 45   2  0cc8  OLESAVEDCLIENTDOC exported, shared data
- 46   3  1c7c  OLERENAME exported, shared data
- 47   2  0cf6  OLEENUMOBJECTS exported, shared data
- 48   3  1d00  OLEQUERYNAME exported, shared data
- 49   3  0c42  OLESETCOLORSCHEME exported, shared data
- 50   3  1034  OLEREQUESTDATA exported, shared data
- 54   4  0000  OLELOCKSERVER exported, shared data
- 55   4  025a  OLEUNLOCKSERVER exported, shared data
- 56   3  0d3c  OLEQUERYSIZE exported, shared data
- 57   3  1cbe  OLEEXECUTE exported, shared data
- 58   3  152e  OLECREATEINVISIBLE exported, shared data
- 59   3  1da4  OLEQUERYCLIENTVERSION exported, shared data
- 60   3  46d4  OLEISDCMETA exported, shared data
-100   4  0c28  DOCWNDPROC exported, shared data
-101   4  0d2c  SRVRWNDPROC exported, shared data
-102  14  0838  MFCALLBACKFUNC exported, shared data
-110   5  0000  DEFLOADFROMSTREAM exported, shared data
-111   5  00fe  DEFCREATEFROMCLIP exported, shared data
-112   5  0180  DEFCREATELINKFROMCLIP exported, shared data
-113   5  01be  DEFCREATEFROMTEMPLATE exported, shared data
-114   5  01fe  DEFCREATE exported, shared data
-115   5  023e  DEFCREATEFROMFILE exported, shared data
-116   5  028e  DEFCREATELINKFROMFILE exported, shared data
-117   5  02e0  DEFCREATEINVISIBLE exported, shared data
-200   4  04e0  LERELEASE exported, shared data
-201   4  1e52  LESHOW exported, shared data
-202   3  2508  LEGETDATA exported, shared data
-203   4  3a54  LESETDATA exported, shared data
-204   4  37ee  LESETHOSTNAMES exported, shared data
-205   4  386e  LESETTARGETDEVICE exported, shared data
-206   4  3922  LESETBOUNDS exported, shared data
-207   3  27be  LESAVETOSTREAM exported, shared data
-208   3  1fde  LECLONE exported, shared data
-209   4  052a  LECOPYFROMLINK exported, shared data
-210   6  0134  LEEQUAL exported, shared data
-211   3  227a  LECOPY exported, shared data
-212   3  2e00  LEQUERYTYPE exported, shared data
-213   3  2370  LEQUERYBOUNDS exported, shared data
-214   3  23fc  LEDRAW exported, shared data
-215   4  2108  LEQUERYOPEN exported, shared data
-216   4  219a  LEACTIVATE exported, shared data
-218   4  2200  LEUPDATE exported, shared data
-219   4  2cb4  LERECONNECT exported, shared data
-220   3  2454  LEENUMFORMAT exported, shared data
-221   6  00c8  LEQUERYPROTOCOL exported, shared data
-222   3  2638  LEQUERYOUTOFDATE exported, shared data
-223   6  01c2  LEOBJECTCONVERT exported, shared data
-224   4  07fa  LECHANGEDATA exported, shared data
-225   4  2c16  LECLOSE exported, shared data
-226   3  2e72  LEGETUPDATEOPTIONS exported, shared data
-227   4  337a  LESETUPDATEOPTIONS exported, shared data
-228   4  4a44  LEEXECUTE exported, shared data
-229   6  0000  LEOBJECTLONG exported, shared data
-230   4  322c  LECREATEINVISIBLE exported, shared data
-300   9  0000  MFRELEASE exported, shared data
-301   9  0258  MFGETDATA exported, shared data
-302   3  42f2  MFSAVETOSTREAM exported, shared data
-303   9  0082  MFCLONE exported, shared data
-304   9  0174  MFEQUAL exported, shared data
-305   9  01f0  MFCOPY exported, shared data
-307   3  446a  MFQUERYBOUNDS exported, shared data
-308  14  05cc  MFDRAW exported, shared data
-309   9  0234  MFENUMFORMAT exported, shared data
-310   9  0302  MFCHANGEDATA exported, shared data
-400  11  0000  BMRELEASE exported, shared data
-401  11  0254  BMGETDATA exported, shared data
-402   3  4b92  BMSAVETOSTREAM exported, shared data
-403  11  006e  BMCLONE exported, shared data
-404  11  00e4  BMEQUAL exported, shared data
-405   3  4c8c  BMCOPY exported, shared data
-407   3  4ce0  BMQUERYBOUNDS exported, shared data
-408  14  0000  BMDRAW exported, shared data
-409  11  0230  BMENUMFORMAT exported, shared data
-410   3  5004  BMCHANGEDATA exported, shared data
-500  12  0000  DIBRELEASE exported, shared data
-501  12  01ea  DIBGETDATA exported, shared data
-502   3  536c  DIBSAVETOSTREAM exported, shared data
-503  12  006e  DIBCLONE exported, shared data
-504  12  00e4  DIBEQUAL exported, shared data
-505  12  011c  DIBCOPY exported, shared data
-507  12  016c  DIBQUERYBOUNDS exported, shared data
-508  14  02f2  DIBDRAW exported, shared data
-509  12  01c6  DIBENUMFORMAT exported, shared data
-510  12  028a  DIBCHANGEDATA exported, shared data
-600  10  0000  GENRELEASE exported, shared data
-601  10  049e  GENGETDATA exported, shared data
-602  10  0438  GENSETDATA exported, shared data
-603   3  4750  GENSAVETOSTREAM exported, shared data
-604  10  0082  GENCLONE exported, shared data
-605  10  012e  GENEQUAL exported, shared data
-606  10  0164  GENCOPY exported, shared data
-608   3  4b60  GENQUERYBOUNDS exported, shared data
-609  14  05b2  GENDRAW exported, shared data
-610  10  04e0  GENENUMFORMAT exported, shared data
-611  10  0222  GENCHANGEDATA exported, shared data
-701  13  0034  ERRSHOW exported, shared data
-702  13  0186  ERRSETDATA exported, shared data
-703  13  0082  ERRSETHOSTNAMES exported, shared data
-704  13  009c  ERRSETTARGETDEVICE exported, shared data
-705  13  00d0  ERRSETBOUNDS exported, shared data
-706  13  0068  ERRCOPYFROMLINK exported, shared data
-707  13  00ea  ERRQUERYOPEN exported, shared data
-708  13  0104  ERRACTIVATE exported, shared data
-709  13  0138  ERRCLOSE exported, shared data
-710  13  0152  ERRUPDATE exported, shared data
-711  13  016c  ERRRECONNECT exported, shared data
-712  13  0222  ERRQUERYPROTOCOL exported, shared data
-713  13  01ba  ERRQUERYOUTOFDATE exported, shared data
-714  13  01d4  ERROBJECTCONVERT exported, shared data
-715  13  01ee  ERRGETUPDATEOPTIONS exported, shared data
-716  13  0208  ERRSETUPDATEOPTIONS exported, shared data
-717  13  0256  ERREXECUTE exported, shared data
-718  13  0270  ERROBJECTLONG exported, shared data
-800   7  0000  PBLOADFROMSTREAM exported, shared data
-801   7  00ac  PBCREATEFROMCLIP exported, shared data
-802   7  017a  PBCREATELINKFROMCLIP exported, shared data
-803   7  0212  PBCREATEFROMTEMPLATE exported, shared data
-804   7  02a8  PBCREATE exported, shared data
-805   7  06f4  PBDRAW exported, shared data
-806   7  0626  PBQUERYBOUNDS exported, shared data
-807   7  0818  PBCOPYTOCLIPBOARD exported, shared data
-808   7  033e  PBCREATEFROMFILE exported, shared data
-809   7  03e0  PBCREATELINKFROMFILE exported, shared data
-810   7  0768  PBENUMFORMATS exported, shared data
-811   7  07a8  PBGETDATA exported, shared data
-812   7  0492  PBCREATEINVISIBLE exported, shared data
-910   3  3e50  OBJQUERYNAME exported, shared data
-911   3  3f06  OBJRENAME exported, shared data
-912   3  410e  OBJQUERYTYPE exported, shared data
-913   3  4154  OBJQUERYSIZE exported, shared data
-950   8  0456  CONNECTDLGPROC exported, shared data
-951   8  0000  SETNETNAME exported, shared data
-952   8  011a  CHECKNETDRIVE exported, shared data
-953   8  025c  SETNEXTNETDRIVE exported, shared data
-954   8  0696  GETTASKVISIBLEWINDOW exported, shared data
diff --git a/etc/olesvr-ordinals b/etc/olesvr-ordinals
deleted file mode 100644
index 02deb6b..0000000
--- a/etc/olesvr-ordinals
+++ /dev/null
@@ -1,23 +0,0 @@
-  1   1  0000  WEP exported, shared data
-  2   3  036e  OLEREGISTERSERVER exported, shared data
-  3   3  05f0  OLEREVOKESERVER exported, shared data
-  4   3  3d46  OLEBLOCKSERVER exported, shared data
-  5   3  3d92  OLEUNBLOCKSERVER exported, shared data
-  6   3  1108  OLEREGISTERSERVERDOC exported, shared data
-  7   3  12dc  OLEREVOKESERVERDOC exported, shared data
-  8   3  13a2  OLERENAMESERVERDOC exported, shared data
-  9   3  1528  OLEREVERTSERVERDOC exported, shared data
- 10   3  14ba  OLESAVEDSERVERDOC exported, shared data
- 11   3  2140  OLEREVOKEOBJECT exported, shared data
- 12   3  0354  OLEQUERYSERVERVERSION exported, shared data
- 21   3  07a2  SRVRWNDPROC exported, shared data
- 22   3  1728  DOCWNDPROC exported, shared data
- 23   3  23b2  ITEMWNDPROC exported, shared data
- 24   3  2d3c  SENDDATAMSG exported, shared data
- 25   3  22ac  FINDITEMWND exported, shared data
- 26   3  2a5c  ITEMCALLBACK exported, shared data
- 27   3  0752  TERMINATECLIENTS exported, shared data
- 28   3  1554  TERMINATEDOCCLIENTS exported, shared data
- 29   3  222e  DELETECLIENTINFO exported, shared data
- 30   3  2cbc  SENDRENAMEMSG exported, shared data
- 31   3  2c5e  ENUMFORTERMINATE exported, shared data
diff --git a/etc/shell-ordinals b/etc/shell-ordinals
deleted file mode 100644
index aa26138..0000000
--- a/etc/shell-ordinals
+++ /dev/null
@@ -1,26 +0,0 @@
-  1   2  15cc  REGOPENKEY exported, shared data
-  2   2  15fa  REGCREATEKEY exported, shared data
-  3   2  1670  REGCLOSEKEY exported, shared data
-  4   2  1628  REGDELETEKEY exported, shared data
-  5   2  16f4  REGSETVALUE exported, shared data
-  6   2  168e  REGQUERYVALUE exported, shared data
-  7   2  14dc  REGENUMKEY exported, shared data
-  8   7  0000  WEP exported, shared data
-  9   6  0052  DRAGACCEPTFILES exported, shared data
- 11   6  0094  DRAGQUERYFILE exported, shared data
- 12   6  0142  DRAGFINISH exported, shared data
- 13   6  0000  DRAGQUERYPOINT exported, shared data
- 20   4  110a  SHELLEXECUTE exported, shared data
- 21   4  1154  FINDEXECUTABLE exported, shared data
- 22   9  0000  SHELLABOUT exported, shared data
- 32   9  0829  WCI exported, shared data
- 33   9  0136  ABOUTDLGPROC exported, shared data
- 34  10  021a  EXTRACTICON exported, shared data
- 36  10  08dc  EXTRACTASSOCIATEDICON exported, shared data
- 37   5  00ae  DOENVIRONMENTSUBST exported, shared data
- 38   5  0000  FINDENVIRONMENTSTRING exported, shared data
- 39  10  026e  INTERNALEXTRACTICON exported, shared data
-100   4  0550  HERETHARBETYGARS exported, shared data
-101   8  010e  FINDEXEDLGPROC exported, shared data
-102   4  128c  REGISTERSHELLHOOK exported, shared data
-103   4  11ca  SHELLHOOKPROC exported, shared data
diff --git a/etc/toolhelp-ordinals b/etc/toolhelp-ordinals
deleted file mode 100644
index 2118519..0000000
--- a/etc/toolhelp-ordinals
+++ /dev/null
@@ -1,35 +0,0 @@
-  1   1  018a  WEP exported, shared data
- 50   1  057b  GLOBALHANDLETOSEL exported, shared data
- 51   1  0318  GLOBALFIRST exported, shared data
- 52   1  0399  GLOBALNEXT exported, shared data
- 53   1  02a2  GLOBALINFO exported, shared data
- 54   1  0417  GLOBALENTRYHANDLE exported, shared data
- 55   1  04a9  GLOBALENTRYMODULE exported, shared data
- 56   1  090e  LOCALINFO exported, shared data
- 57   1  095e  LOCALFIRST exported, shared data
- 58   1  09e9  LOCALNEXT exported, shared data
- 59   1  0a90  MODULEFIRST exported, shared data
- 60   1  0ad9  MODULENEXT exported, shared data
- 61   1  0b15  MODULEFINDNAME exported, shared data
- 62   1  0b8c  MODULEFINDHANDLE exported, shared data
- 63   1  0caa  TASKFIRST exported, shared data
- 64   1  0ced  TASKNEXT exported, shared data
- 65   1  0d2e  TASKFINDHANDLE exported, shared data
- 66   1  0f1c  STACKTRACEFIRST exported, shared data
- 67   1  0f67  STACKTRACECSIPFIRST exported, shared data
- 68   1  0fca  STACKTRACENEXT exported, shared data
- 69   1  28b0  CLASSFIRST exported, shared data
- 70   1  2925  CLASSNEXT exported, shared data
- 71   1  11ce  SYSTEMHEAPINFO exported, shared data
- 72   1  13f4  MEMMANINFO exported, shared data
- 73   1  1b72  NOTIFYREGISTER exported, shared data
- 74   1  1c29  NOTIFYUNREGISTER exported, shared data
- 75   1  2060  INTERRUPTREGISTER exported, shared data
- 76   1  2111  INTERRUPTUNREGISTER exported, shared data
- 77   1  26ea  TERMINATEAPP exported, shared data
- 78   1  29c4  MEMORYREAD exported, shared data
- 79   1  2b6c  MEMORYWRITE exported, shared data
- 80   1  2dae  TIMERCOUNT exported, shared data
- 81   1  0d68  TASKSETCSIP exported, shared data
- 82   1  0d97  TASKGETCSIP exported, shared data
- 83   1  0dc0  TASKSWITCH exported, shared data
diff --git a/etc/user-ordinals b/etc/user-ordinals
deleted file mode 100644
index 6df81ba..0000000
--- a/etc/user-ordinals
+++ /dev/null
@@ -1,413 +0,0 @@
-  1   1  ab5d  MESSAGEBOX exported, shared data
-  2   3  0059  OLDEXITWINDOWS exported, shared data
-  3   5  0165  ENABLEOEMLAYER exported, shared data
-  4   5  01a2  DISABLEOEMLAYER exported, shared data
-  5   5  03a2  INITAPP exported, shared data
-  6   1  81d4  POSTQUITMESSAGE exported, shared data
-  7   5  0303  EXITWINDOWS exported, shared data
-  8   3  0232  WEP exported, shared data
- 10   1  a8e8  SETTIMER exported, shared data
- 11   1  744c  BEAR11 exported, shared data
- 12   1  a905  KILLTIMER exported, shared data
- 13   1  729f  GETTICKCOUNT exported, shared data
- 14   1  7439  GETTIMERRESOLUTION exported
- 15   1  729f  GETCURRENTTIME exported, shared data
- 16   1  abc5  CLIPCURSOR exported, shared data
- 17   1  abab  GETCURSORPOS exported, shared data
- 18   1  a8d4  SETCAPTURE exported, shared data
- 19   1  28bd  RELEASECAPTURE exported, shared data
- 20   1  8161  SETDOUBLECLICKTIME exported, shared data
- 21   1  8171  GETDOUBLECLICKTIME exported, shared data
- 22   1  a875  SETFOCUS exported, shared data
- 23   1  8183  GETFOCUS exported, shared data
- 24  13  24e7  REMOVEPROP exported, shared data
- 25   1  1c95  GETPROP exported, shared data
- 26  13  24ca  SETPROP exported, shared data
- 27  13  2504  ENUMPROPS exported, shared data
- 28   1  1874  CLIENTTOSCREEN exported, shared data
- 29   1  189e  SCREENTOCLIENT exported, shared data
- 30   1  713c  WINDOWFROMPOINT exported, shared data
- 31   1  192d  ISICONIC exported, shared data
- 32   1  1825  GETWINDOWRECT exported, shared data
- 33   1  1828  GETCLIENTRECT exported, shared data
- 34   1  a919  ENABLEWINDOW exported, shared data
- 35   1  1912  ISWINDOWENABLED exported, shared data
- 36   1  ab25  GETWINDOWTEXT exported, shared data
- 37   1  ab05  SETWINDOWTEXT exported, shared data
- 38   1  ab49  GETWINDOWTEXTLENGTH exported, shared data
- 39   1  a971  BEGINPAINT exported, shared data
- 40   1  a991  ENDPAINT exported, shared data
- 41   8  0f1b  CREATEWINDOW exported, shared data
- 42  14  103e  SHOWWINDOW exported, shared data
- 43  14  1088  CLOSEWINDOW exported, shared data
- 44  14  1074  OPENICON exported, shared data
- 45   7  1836  BRINGWINDOWTOTOP exported, shared data
- 46   2  0dde  GETPARENT exported, shared data
- 47   1  1802  ISWINDOW exported, shared data
- 48   1  1bd3  ISCHILD exported, shared data
- 49   1  1c28  ISWINDOWVISIBLE exported, shared data
- 50   6  1f72  FINDWINDOW exported, shared data
- 51   1  1a6c  BEAR51 exported, shared data
- 52  14  03f0  ANYPOPUP exported, shared data
- 53   8  0faa  DESTROYWINDOW exported, shared data
- 54   1  ad20  ENUMWINDOWS exported, shared data
- 55   1  ad03  ENUMCHILDWINDOWS exported, shared data
- 56   7  17a6  MOVEWINDOW exported, shared data
- 57   8  0e7c  REGISTERCLASS exported, shared data
- 58   8  0eeb  GETCLASSNAME exported, shared data
- 59   1  a949  SETACTIVEWINDOW exported, shared data
- 60   1  818d  GETACTIVEWINDOW exported, shared data
- 61  13  23dd  SCROLLWINDOW exported, shared data
- 62  18  1a00  SETSCROLLPOS exported, shared data
- 63  18  1a22  GETSCROLLPOS exported, shared data
- 64  18  1a44  SETSCROLLRANGE exported, shared data
- 65  18  1a66  GETSCROLLRANGE exported, shared data
- 66   1  a60b  GETDC exported, shared data
- 67   1  a5f7  GETWINDOWDC exported, shared data
- 68   1  a61f  RELEASEDC exported, shared data
- 69   1  ab97  SETCURSOR exported, shared data
- 70   1  822c  SETCURSORPOS exported, shared data
- 71   1  150c  SHOWCURSOR exported, shared data
- 72   1  1d3d  SETRECT exported, shared data
- 73   1  1d64  SETRECTEMPTY exported, shared data
- 74   1  1d7d  COPYRECT exported, shared data
- 75   1  1d9a  ISRECTEMPTY exported, shared data
- 76   1  1dc0  PTINRECT exported, shared data
- 77   1  1df4  OFFSETRECT exported, shared data
- 78   1  1e19  INFLATERECT exported, shared data
- 79   1  1e3e  INTERSECTRECT exported, shared data
- 80   1  1ea6  UNIONRECT exported, shared data
- 81   1  ac40  FILLRECT exported, shared data
- 82   1  acd0  INVERTRECT exported, shared data
- 83   1  ac88  FRAMERECT exported, shared data
- 84  13  239c  DRAWICON exported, shared data
- 85   6  1e91  DRAWTEXT exported, shared data
- 86  13  0229  BEAR86 exported, shared data
- 87  25  263b  DIALOGBOX exported, shared data
- 88  25  26e5  ENDDIALOG exported, shared data
- 89  24  09ce  CREATEDIALOG exported, shared data
- 90  25  2804  ISDIALOGMESSAGE exported, shared data
- 91  25  26f9  GETDLGITEM exported, shared data
- 92  25  2741  SETDLGITEMTEXT exported, shared data
- 93  25  2761  GETDLGITEMTEXT exported, shared data
- 94  25  270d  SETDLGITEMINT exported, shared data
- 95  25  2721  GETDLGITEMINT exported, shared data
- 96  25  2789  CHECKRADIOBUTTON exported, shared data
- 97  25  2775  CHECKDLGBUTTON exported, shared data
- 98  25  279d  ISDLGBUTTONCHECKED exported, shared data
- 99  37  0fdf  DLGDIRSELECT exported, shared data
-100  37  0fb1  DLGDIRLIST exported, shared data
-101  25  27b1  SENDDLGITEMMESSAGE exported, shared data
-102   2  0cd2  ADJUSTWINDOWRECT exported, shared data
-103  25  2853  MAPDIALOGRECT exported, shared data
-104   1  1bab  MESSAGEBEEP exported, shared data
-105   6  1f5e  FLASHWINDOW exported, shared data
-106   1  4f46  GETKEYSTATE exported, shared data
-107   1  a7fc  DEFWINDOWPROC exported, shared data
-108   1  a68f  GETMESSAGE exported, shared data
-109   1  a744  PEEKMESSAGE exported, shared data
-110   1  a7b7  POSTMESSAGE exported, shared data
-111   1  a786  SENDMESSAGE exported, shared data
-112   1  3dc4  WAITMESSAGE exported, shared data
-113   1  a6b2  TRANSLATEMESSAGE exported, shared data
-114   1  a6fb  DISPATCHMESSAGE exported, shared data
-115   1  3c37  REPLYMESSAGE exported, shared data
-116   1  a7e8  POSTAPPMESSAGE exported, shared data
-118   1  8214  REGISTERWINDOWMESSAGE exported, shared data
-119   1  81ae  GETMESSAGEPOS exported, shared data
-120   1  81a1  GETMESSAGETIME exported, shared data
-121   1  ad68  SETWINDOWSHOOK exported, shared data
-122   1  a827  CALLWINDOWPROC exported, shared data
-123   1  a85b  CALLMSGFILTER exported, shared data
-124   1  a95d  UPDATEWINDOW exported, shared data
-125   1  aa27  INVALIDATERECT exported, shared data
-126   1  aa67  INVALIDATERGN exported, shared data
-127   1  aa47  VALIDATERECT exported, shared data
-128   1  aa93  VALIDATERGN exported, shared data
-129   2  0d8e  GETCLASSWORD exported, shared data
-130   2  0da2  SETCLASSWORD exported, shared data
-131   2  0db6  GETCLASSLONG exported, shared data
-132   2  0dca  SETCLASSLONG exported, shared data
-133   2  0d06  GETWINDOWWORD exported, shared data
-134   2  0d1a  SETWINDOWWORD exported, shared data
-135   2  0d3a  GETWINDOWLONG exported, shared data
-136   2  0d4e  SETWINDOWLONG exported, shared data
-137  39  0710  OPENCLIPBOARD exported, shared data
-138  39  0643  CLOSECLIPBOARD exported, shared data
-139  39  0261  EMPTYCLIPBOARD exported, shared data
-140  39  00ee  GETCLIPBOARDOWNER exported, shared data
-141  39  02f4  SETCLIPBOARDDATA exported, shared data
-142  39  0425  GETCLIPBOARDDATA exported, shared data
-143  39  0075  COUNTCLIPBOARDFORMATS exported, shared data
-144  39  06bb  ENUMCLIPBOARDFORMATS exported, shared data
-145   1  8214  REGISTERCLIPBOARDFORMAT exported, shared data
-146  39  0752  GETCLIPBOARDFORMATNAME exported, shared data
-147  39  0724  SETCLIPBOARDVIEWER exported, shared data
-148  39  00f9  GETCLIPBOARDVIEWER exported, shared data
-149  39  0738  CHANGECLIPBOARDCHAIN exported, shared data
-150   9  1076  LOADMENU exported, shared data
-151   9  0806  CREATEMENU exported, shared data
-152   9  118e  DESTROYMENU exported, shared data
-153   9  10db  CHANGEMENU exported, shared data
-154   9  11a2  CHECKMENUITEM exported, shared data
-155   9  11c7  ENABLEMENUITEM exported, shared data
-156   9  1160  GETSYSTEMMENU exported, shared data
-157   9  10ad  GETMENU exported, shared data
-158   9  10c1  SETMENU exported, shared data
-159   9  11ec  GETSUBMENU exported, shared data
-160  10  30c3  DRAWMENUBAR exported, shared data
-161   9  10fd  GETMENUSTRING exported, shared data
-162  19  0b49  HILITEMENUITEM exported, shared data
-163  13  2521  CREATECARET exported, shared data
-164  13  0bfa  DESTROYCARET exported, shared data
-165  13  0db8  SETCARETPOS exported, shared data
-166  13  254f  HIDECARET exported, shared data
-167  13  2563  SHOWCARET exported, shared data
-168   3  24fd  SETCARETBLINKTIME exported, shared data
-169  13  0d8f  GETCARETBLINKTIME exported, shared data
-170   4  04c0  ARRANGEICONICWINDOWS exported, shared data
-171   2  0e3c  WINHELP exported, shared data
-172  23  0ceb  SWITCHTOTHISWINDOW exported, shared data
-173  12  169b  LOADCURSOR exported, shared data
-174  12  1712  LOADICON exported, shared data
-175  12  167e  LOADBITMAP exported, shared data
-176  12  17af  LOADSTRING exported, shared data
-177  12  1661  LOADACCELERATORS exported, shared data
-178  19  0af4  TRANSLATEACCELERATOR exported, shared data
-179   1  a92d  GETSYSTEMMETRICS exported, shared data
-180   1  8135  GETSYSCOLOR exported, shared data
-181  41  186f  SETSYSCOLORS exported, shared data
-182   1  74f4  BEAR182 exported, shared data
-183  13  0d9a  GETCARETPOS exported, shared data
-184   1  490e  QUERYSENDMESSAGE exported, shared data
-185  10  30d7  GRAYSTRING exported, shared data
-186   1  1cee  SWAPMOUSEBUTTON exported
-187   9  00fe  ENDMENU exported, shared data
-188   1  a772  SETSYSMODALWINDOW exported, shared data
-189   1  19d4  GETSYSMODALWINDOW exported, shared data
-190   1  a9b1  GETUPDATERECT exported, shared data
-191   1  abf9  CHILDWINDOWFROMPOINT exported, shared data
-192   1  3dba  INSENDMESSAGE exported, shared data
-193  39  0030  ISCLIPBOARDFORMATAVAILABLE exported, shared data
-194  37  104d  DLGDIRSELECTCOMBOBOX exported, shared data
-195  37  101f  DLGDIRLISTCOMBOBOX exported, shared data
-196   6  1f1d  TABBEDTEXTOUT exported, shared data
-197   6  1edc  GETTABBEDTEXTEXTENT exported, shared data
-198  15  0875  CASCADECHILDWINDOWS exported, shared data
-199  15  0956  TILECHILDWINDOWS exported, shared data
-200  40  09d9  OPENCOMM exported, shared data
-201  40  09f6  SETCOMMSTATE exported, shared data
-202  40  0a13  GETCOMMSTATE exported, shared data
-203  40  0acd  GETCOMMERROR exported, shared data
-204  40  0a3d  READCOMM exported, shared data
-205  40  0a85  WRITECOMM exported, shared data
-206  40  0b1d  TRANSMITCOMMCHAR exported, shared data
-207  40  0aaf  CLOSECOMM exported, shared data
-208  40  0b3b  SETCOMMEVENTMASK exported, shared data
-209  40  0b64  GETCOMMEVENTMASK exported, shared data
-210  40  0b8d  SETCOMMBREAK exported, shared data
-211  40  0bab  CLEARCOMMBREAK exported, shared data
-212  40  0a67  UNGETCOMMCHAR exported, shared data
-213  40  0af4  BUILDCOMMDCB exported, shared data
-214  40  0be7  ESCAPECOMMFUNCTION exported, shared data
-215  40  0bc9  FLUSHCOMM exported, shared data
-216  41  181e  USERSEEUSERDO exported, shared data
-217   9  0163  LOOKUPMENUHANDLE exported, shared data
-218  25  2667  DIALOGBOXINDIRECT exported, shared data
-219  24  09fa  CREATEDIALOGINDIRECT exported, shared data
-220   9  1093  LOADMENUINDIRECT exported, shared data
-221  13  2409  SCROLLDC exported, shared data
-222   1  a889  GETKEYBOARDSTATE exported, shared data
-223   1  a8a3  SETKEYBOARDSTATE exported, shared data
-224   1  ad54  GETWINDOWTASK exported, shared data
-225   1  ad37  ENUMTASKWINDOWS exported, shared data
-226   1  4983  LOCKINPUT exported, shared data
-227  19  0ac0  GETNEXTDLGGROUPITEM exported, shared data
-228  19  0ada  GETNEXTDLGTABITEM exported, shared data
-229   2  0df2  GETTOPWINDOW exported, shared data
-230   2  08f2  GETNEXTWINDOW exported, shared data
-231   1  4afb  GETSYSTEMDEBUGSTATE exported, shared data
-232   7  17ba  SETWINDOWPOS exported, shared data
-233  14  109c  SETPARENT exported, shared data
-234   1  ad9a  UNHOOKWINDOWSHOOK exported, shared data
-235   1  adc4  DEFHOOKPROC exported, shared data
-236   1  8197  GETCAPTURE exported, shared data
-237   1  a9d1  GETUPDATERGN exported, shared data
-238   1  a9fa  EXCLUDEUPDATERGN exported, shared data
-239  25  2690  DIALOGBOXPARAM exported, shared data
-240  25  26bc  DIALOGBOXINDIRECTPARAM exported, shared data
-241  24  0a29  CREATEDIALOGPARAM exported, shared data
-242  24  0a55  CREATEDIALOGINDIRECTPARAM exported, shared data
-243  25  0aa3  GETDIALOGBASEUNITS exported, shared data
-244   1  2094  EQUALRECT exported, shared data
-245  40  0c06  ENABLECOMMNOTIFICATION exported, shared data
-246   5  05de  EXITWINDOWSEXEC exported, shared data
-247   1  14ca  GETCURSOR exported, shared data
-248  39  0600  GETOPENCLIPBOARDWINDOW exported, shared data
-249   1  4f59  GETASYNCKEYSTATE exported, shared data
-250   9  113b  GETMENUSTATE exported, shared data
-251   2  0e5c  SENDDRIVERMESSAGE exported, shared data
-252  41  18cb  OPENDRIVER exported, shared data
-253  41  18f1  CLOSEDRIVER exported, shared data
-254  41  1905  GETDRIVERMODULEHANDLE exported, shared data
-255   2  0e70  DEFDRIVERPROC exported, shared data
-256   2  0eaf  GETDRIVERINFO exported, shared data
-257   2  0e84  GETNEXTDRIVER exported, shared data
-258   1  18c8  MAPWINDOWPOINTS exported, shared data
-259   7  00b5  BEGINDEFERWINDOWPOS exported, shared data
-260   7  17eb  DEFERWINDOWPOS exported, shared data
-261   7  1822  ENDDEFERWINDOWPOS exported, shared data
-262   2  0e1a  GETWINDOW exported, shared data
-263   9  1217  GETMENUITEMCOUNT exported, shared data
-264   9  1200  GETMENUITEMID exported, shared data
-265  14  1060  SHOWOWNEDPOPUPS exported, shared data
-266   1  56b0  SETMESSAGEQUEUE exported, shared data
-267  18  1aa0  SHOWSCROLLBAR exported, shared data
-268   1  21cd  GLOBALADDATOM exported, shared data
-269   1  2236  GLOBALDELETEATOM exported, shared data
-270   1  2251  GLOBALFINDATOM exported, shared data
-271   1  226f  GLOBALGETATOMNAME exported, shared data
-272   1  1930  ISZOOMED exported, shared data
-273  41  1716  CONTROLPANELINFO exported, shared data
-274  23  0d8e  GETNEXTQUEUEWINDOW exported, shared data
-275   1  77a7  REPAINTSCREEN exported, shared data
-276   1  6eea  LOCKMYTASK exported, shared data
-277  25  27c5  GETDLGCTRLID exported, shared data
-278   1  19ca  GETDESKTOPHWND exported, shared data
-279  41  0a51  OLDSETDESKPATTERN exported, shared data
-280   9  1174  SETSYSTEMMENU exported, shared data
-282   6  1f95  SELECTPALETTE exported, shared data
-283   6  1fd1  REALIZEPALETTE exported, shared data
-284  41  1740  GETFREESYSTEMRESOURCES exported, shared data
-285  41  1736  BEAR285 exported, shared data
-286   1  19ca  GETDESKTOPWINDOW exported, shared data
-287   2  0e06  GETLASTACTIVEPOPUP exported, shared data
-288   1  81bb  GETMESSAGEEXTRAINFO exported, shared data
-289   1  4b59  KEYBD_EVENT exported, shared data
-290   1  aabf  REDRAWWINDOW exported, shared data
-291   1  adde  SETWINDOWSHOOKEX exported, shared data
-292   1  ae14  UNHOOKWINDOWSHOOKEX exported, shared data
-293   1  ae35  CALLNEXTHOOKEX exported, shared data
-294  13  23c9  LOCKWINDOWUPDATE exported, shared data
-299   1  507a  MOUSE_EVENT exported, shared data
-301  26  0000  BOZOSLIVEHERE exported, shared data
-306  10  1587  BEAR306 exported, shared data
-308  25  27d9  DEFDLGPROC exported, shared data
-309   1  abdf  GETCLIPCURSOR exported, shared data
-314   1  09bc  SIGNALPROC exported, shared data
-319  13  246c  SCROLLWINDOWEX exported, shared data
-320   1  9325  SYSERRORBOX exported, shared data
-321   1  a8bd  SETEVENTHOOK exported, shared data
-322  41  0e6e  WINOLDAPPHACKOMATIC exported, shared data
-323   1  244f  GETMESSAGE2 exported, shared data
-324   1  7766  FILLWINDOW exported, shared data
-325   1  76eb  PAINTRECT exported, shared data
-326   6  02d2  GETCONTROLBRUSH exported, shared data
-331   1  4f36  ENABLEHARDWAREINPUT exported
-332   1  3df2  USERYIELD exported, shared data
-333   1  334e  ISUSERIDLE exported, shared data
-334   1  4fed  GETQUEUESTATUS exported, shared data
-335   1  501c  GETINPUTSTATE exported, shared data
-336  12  0deb  LOADCURSORICONHANDLER exported, shared data
-337   1  530a  GETMOUSEEVENTPROC exported, shared data
-341   1  1798  _FFFE_FARFRAME exported, shared data
-343   1  9c7c  GETFILEPORTNAME exported, shared data
-356  12  0ff1  LOADDIBCURSORHANDLER exported, shared data
-357  12  100d  LOADDIBICONHANDLER exported, shared data
-358   9  0fa0  ISMENU exported, shared data
-359   1  a64c  GETDCEX exported, shared data
-362   1  8a00  DCHOOK exported, shared data
-368  12  176f  COPYICON exported, shared data
-369  12  16f8  COPYCURSOR exported, shared data
-370  14  0fde  GETWINDOWPLACEMENT exported, shared data
-371  14  100e  SETWINDOWPLACEMENT exported, shared data
-372  12  1789  GETINTERNALICONHEADER exported, shared data
-373   1  20b8  SUBTRACTRECT exported, shared data
-400   3  2570  FINALUSERINIT exported, shared data
-402  39  077c  GETPRIORITYCLIPBOARDFORMAT exported, shared data
-403   8  0ea5  UNREGISTERCLASS exported, shared data
-404   8  0ec2  GETCLASSINFO exported, shared data
-406  12  16b8  CREATECURSOR exported, shared data
-407  12  172f  CREATEICON exported, shared data
-408  12  0000  CREATECURSORICONINDIRECT exported, shared data
-410   9  122e  INSERTMENU exported, shared data
-411   9  1250  APPENDMENU exported, shared data
-412   9  1294  REMOVEMENU exported, shared data
-413   9  12b6  DELETEMENU exported, shared data
-414   9  1272  MODIFYMENU exported, shared data
-415   9  0813  CREATEPOPUPMENU exported, shared data
-416   9  132a  TRACKPOPUPMENU exported, shared data
-417   9  07ab  GETMENUCHECKMARKDIMENSIONS exported, shared data
-418   9  12d8  SETMENUITEMBITMAPS exported, shared data
-420  16  055a  _WSPRINTF exported, shared data
-421  16  0518  WVSPRINTF exported, shared data
-422  37  0fff  DLGDIRSELECTEX exported, shared data
-423  37  106d  DLGDIRSELECTCOMBOBOXEX exported, shared data
-430  11  0359  LSTRCMP exported, shared data
-431  11  0365  ANSIUPPER exported, shared data
-432  11  0381  ANSILOWER exported, shared data
-433  11  0203  ISCHARALPHA exported, shared data
-434  11  0208  ISCHARALPHANUMERIC exported, shared data
-435  11  020d  ISCHARUPPER exported, shared data
-436  11  0212  ISCHARLOWER exported, shared data
-437  11  039d  ANSIUPPERBUFF exported, shared data
-438  11  03b7  ANSILOWERBUFF exported, shared data
-445  15  1a6e  DEFFRAMEPROC exported, shared data
-447  15  1a82  DEFMDICHILDPROC exported, shared data
-451  15  1aad  TRANSLATEMDISYSACCEL exported, shared data
-452   8  0f57  CREATEWINDOWEX exported, shared data
-454   2  0cec  ADJUSTWINDOWRECTEX exported, shared data
-455  12  052b  GETICONID exported, shared data
-456  12  0328  LOADICONHANDLER exported, shared data
-457  12  175b  DESTROYICON exported, shared data
-458  12  16e4  DESTROYCURSOR exported, shared data
-459  12  01bb  DUMPICON exported, shared data
-460  14  0a85  GETINTERNALWINDOWPOS exported, shared data
-461  14  0aef  SETINTERNALWINDOWPOS exported, shared data
-462  15  0276  CALCCHILDSCROLL exported, shared data
-463  15  053f  SCROLLCHILDREN exported, shared data
-464  14  0fbe  DRAGOBJECT exported, shared data
-465  14  035e  DRAGDETECT exported, shared data
-466   1  ac0d  DRAWFOCUSRECT exported, shared data
-470  11  02e7  STRINGFUNC exported, shared data
-471  11  035f  LSTRCMPI exported, shared data
-472  11  03d1  ANSINEXT exported, shared data
-473  11  03eb  ANSIPREV exported, shared data
-480   1  1d38  GETUSERLOCALOBJTYPE exported, shared data
-481   1  4d6c  HARDWARE_EVENT exported, shared data
-482  18  1ac2  ENABLESCROLLBAR exported, shared data
-483  41  1895  SYSTEMPARAMETERSINFO exported, shared data
-484   1  b664  __GP exported, shared data
-499  22  005c  WNETERRORTEXT exported, shared data
-501  22  0a68  WNETOPENJOB exported, shared data
-502  22  0a9d  WNETCLOSEJOB exported, shared data
-503  22  0b40  WNETABORTJOB exported, shared data
-504  22  0acc  WNETHOLDJOB exported, shared data
-505  22  0ae9  WNETRELEASEJOB exported, shared data
-506  22  0b06  WNETCANCELJOB exported, shared data
-507  22  0b23  WNETSETJOBCOPIES exported, shared data
-508  22  09ca  WNETWATCHQUEUE exported, shared data
-509  22  09f9  WNETUNWATCHQUEUE exported, shared data
-510  22  0a16  WNETLOCKQUEUEDATA exported, shared data
-511  22  0a4b  WNETUNLOCKQUEUEDATA exported, shared data
-512  22  0992  WNETGETCONNECTION exported, shared data
-513  22  08a6  WNETGETCAPS exported, shared data
-514  22  08c7  WNETDEVICEMODE exported, shared data
-515  22  08de  WNETBROWSEDIALOG exported, shared data
-516  22  0914  WNETGETUSER exported, shared data
-517  22  0940  WNETADDCONNECTION exported, shared data
-518  22  0975  WNETCANCELCONNECTION exported, shared data
-519  22  0b63  WNETGETERROR exported, shared data
-520  22  0b80  WNETGETERRORTEXT exported, shared data
-521  22  0847  WNETENABLE exported, shared data
-522  22  084e  WNETDISABLE exported, shared data
-523  22  0478  WNETRESTORECONNECTION exported, shared data
-524  22  0855  WNETWRITEJOB exported, shared data
-525  22  085e  WNETCONNECTDIALOG exported, shared data
-526  22  0867  WNETDISCONNECTDIALOG exported, shared data
-527  22  0870  WNETCONNECTIONDIALOG exported, shared data
-528  22  0879  WNETVIEWQUEUEDIALOG exported, shared data
-529  22  088b  WNETPROPERTYDIALOG exported, shared data
-530  22  0894  WNETGETDIRECTORYTYPE exported, shared data
-531  22  089d  WNETDIRECTORYNOTIFY exported, shared data
-532  22  0882  WNETGETPROPERTYTEXT exported, shared data
diff --git a/etc/win87em-ordinals b/etc/win87em-ordinals
deleted file mode 100644
index 00ee2ab..0000000
--- a/etc/win87em-ordinals
+++ /dev/null
@@ -1,5 +0,0 @@
-  1   1  002a  __FPMATH exported
-  2   1  0089  WEP exported
-  3   1  01ab  __WIN87EMINFO exported
-  4   1  0220  __WIN87EMRESTORE exported
-  5   1  01e3  __WIN87EMSAVE exported
diff --git a/files/drive.c b/files/drive.c
index 948f9b6..92c2c26 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -176,7 +176,7 @@
  */
 int DRIVE_GetCurrentDrive(void)
 {
-    TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
+    TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
     if (pTask && (pTask->curdrive & 0x80)) return pTask->curdrive & ~0x80;
     return DRIVE_CurDrive;
 }
@@ -187,7 +187,7 @@
  */
 int DRIVE_SetCurrentDrive( int drive )
 {
-    TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
+    TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
     if (!DRIVE_IsValid( drive ))
     {
         DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
@@ -270,7 +270,7 @@
  */
 const char * DRIVE_GetDosCwd( int drive )
 {
-    TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
+    TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
     if (!DRIVE_IsValid( drive )) return NULL;
 
     /* Check if we need to change the directory to the new task. */
@@ -291,7 +291,7 @@
  */
 const char * DRIVE_GetUnixCwd( int drive )
 {
-    TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
+    TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
     if (!DRIVE_IsValid( drive )) return NULL;
 
     /* Check if we need to change the directory to the new task. */
@@ -356,7 +356,7 @@
     char buffer[MAX_PATHNAME_LEN];
     const char *unix_cwd, *dos_cwd;
     BYTE attr;
-    TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
+    TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
 
     dprintf_dosfs( stddeb, "DRIVE_Chdir(%c:,%s)\n", 'A' + drive, path );
     strcpy( buffer, "A:" );
diff --git a/files/file.c b/files/file.c
index 758aa64..e9881a0 100644
--- a/files/file.c
+++ b/files/file.c
@@ -101,7 +101,7 @@
 {
     PDB *pdb;
 
-    if ((pdb = (PDB *)GlobalLock( GetCurrentPDB() )) != NULL)
+    if ((pdb = (PDB *)GlobalLock16( GetCurrentPDB() )) != NULL)
     {
         *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
         *nbFiles = pdb->nbFiles;
@@ -219,7 +219,7 @@
 {
     BYTE *files;
     WORD count;
-    PDB *pdb = (PDB *)GlobalLock( hPDB );
+    PDB *pdb = (PDB *)GlobalLock16( hPDB );
 
     if (!pdb) return;
     files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
@@ -572,7 +572,7 @@
 HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 )
 {
     DOS_FILE *file;
-    PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() );
+    PDB *pdb = (PDB *)GlobalLock16( GetCurrentPDB() );
     BYTE *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
 
     dprintf_file( stddeb, "FILE_Dup2 for handle %d\n", hFile1 );
@@ -702,7 +702,8 @@
                       name, ofs->szPathName, hFileRet );
         /* Return the handle, but close it first */
         FILE_FreeTaskHandle( hFileRet );
-        return hFileRet;
+/*        return hFileRet; */
+        return 0;  /* Progman seems to like this better */
     }
 
     /* OF_CREATE is completely different from all other options, so
@@ -875,7 +876,7 @@
 /***********************************************************************
  *           _lcreat   (KERNEL.83)
  */
-INT _lcreat( LPCSTR path, INT attr )
+HFILE _lcreat( LPCSTR path, INT attr )
 {
     DOS_FILE *file;
     HFILE handle;
@@ -893,7 +894,7 @@
 /***********************************************************************
  *           _lcreat_uniq   (Not a Windows API)
  */
-INT _lcreat_uniq( LPCSTR path, INT attr )
+HFILE _lcreat_uniq( LPCSTR path, INT attr )
 {
     DOS_FILE *file;
     HFILE handle;
@@ -1021,7 +1022,7 @@
 WORD SetHandleCount( WORD count )
 {
     HANDLE hPDB = GetCurrentPDB();
-    PDB *pdb = (PDB *)GlobalLock( hPDB );
+    PDB *pdb = (PDB *)GlobalLock16( hPDB );
     BYTE *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
     WORD i;
 
@@ -1048,10 +1049,10 @@
         {
             memcpy( pdb->fileHandles, files, 20 );
 #ifdef WINELIB
-            GlobalFree( (HGLOBAL)pdb->fileHandlesPtr );
+            GlobalFree32( (HGLOBAL32)pdb->fileHandlesPtr );
             pdb->fileHandlesPtr = (SEGPTR)pdb->fileHandles;
 #else
-            GlobalFree( GlobalHandle( SELECTOROF(pdb->fileHandlesPtr) ));
+            GlobalFree16( GlobalHandle16( SELECTOROF(pdb->fileHandlesPtr) ));
             pdb->fileHandlesPtr = (SEGPTR)MAKELONG( 0x18,
                                                    GlobalHandleToSel( hPDB ) );
 #endif
@@ -1061,13 +1062,17 @@
     else  /* More than 20, need a new file handles table */
     {
         BYTE *newfiles;
-        HANDLE newhandle = GlobalAlloc( GMEM_MOVEABLE, count );
+#ifdef WINELIB
+        newfiles = (BYTE *)GlobalAlloc32( GMEM_FIXED, count );
+#else
+        HANDLE newhandle = GlobalAlloc16( GMEM_MOVEABLE, count );
         if (!newhandle)
         {
             DOS_ERROR( ER_OutOfMemory, EC_OutOfResource, SA_Abort, EL_Memory );
             return pdb->nbFiles;
         }
-        newfiles = (BYTE *)GlobalLock( newhandle );
+        newfiles = (BYTE *)GlobalLock16( newhandle );
+#endif  /* WINELIB */
         if (count > pdb->nbFiles)
         {
             memcpy( newfiles, files, pdb->nbFiles );
@@ -1075,12 +1080,13 @@
         }
         else memcpy( newfiles, files, count );
 #ifdef WINELIB
-        if (pdb->nbFiles > 20) GlobalFree( (HGLOBAL)pdb->fileHandlesPtr );
+        if (pdb->nbFiles > 20) GlobalFree32( (HGLOBAL32)pdb->fileHandlesPtr );
+        pdb->fileHandlesPtr = (SEGPTR)newfiles;
 #else
         if (pdb->nbFiles > 20)
-            GlobalFree( GlobalHandle( SELECTOROF(pdb->fileHandlesPtr) ));
-#endif
-        pdb->fileHandlesPtr = WIN16_GlobalLock( newhandle );
+            GlobalFree16( GlobalHandle16( SELECTOROF(pdb->fileHandlesPtr) ));
+        pdb->fileHandlesPtr = WIN16_GlobalLock16( newhandle );
+#endif  /* WINELIB */
         pdb->nbFiles = count;
     }
     return pdb->nbFiles;
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 684948a..c33bf52 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -8,6 +8,7 @@
 	comdlg32.spec \
 	commdlg.spec \
 	compobj.spec \
+	crtdll.spec	\
 	ddeml.spec \
 	gdi.spec \
 	gdi32.spec \
@@ -17,6 +18,7 @@
 	lzexpand.spec \
 	mmsystem.spec \
 	mouse.spec \
+	ntdll.spec	\
 	ole2.spec \
 	ole2conv.spec \
 	ole2disp.spec \
@@ -40,7 +42,8 @@
 	winsock.spec \
 	winspool.spec \
 	wprocs.spec \
-	wprocs32.spec
+	wprocs32.spec \
+	wsock32.spec
 
 SPEC_FILES = $(DLLS:.spec=.S)
 
diff --git a/if1632/crtdll.spec b/if1632/crtdll.spec
new file mode 100644
index 0000000..5cdb2ca
--- /dev/null
+++ b/if1632/crtdll.spec
@@ -0,0 +1,530 @@
+name	crtdll
+type	win32
+base	1
+
+001 stub ??2@YAPAXI@Z
+002 stub ??3@YAXPAX@Z
+003 stub ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z
+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 stub __GetMainArgs
+023 stub __argc_dll
+024 stub __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 stub _acmdln_dll
+039 stub _aexit_rtn_dll
+040 stub _amsg_exit
+041 stub _assert
+042 stub _basemajor_dll
+043 stub _baseminor_dll
+044 stub _baseversion_dll
+045 stub _beep
+046 stub _beginthread
+047 stub _c_exit
+048 stub _cabs
+049 stub _cexit
+050 stub _cgets
+051 stub _chdir
+052 stub _chdrive
+053 stub _chgsign
+054 stub _chmod
+055 stub _chsize
+056 stub _clearfp
+057 stub _close
+058 stub _commit
+059 stub _commode_dll
+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 stub _environ_dll
+076 stub _eof
+077 stub _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
+100 stub _findnext
+101 stub _finite
+102 stub _flsbuf
+103 stub _flushall
+104 stub _fmode_dll
+105 stub _fpclass
+106 stub _fpieee_flt
+107 stub _fpreset
+108 stub _fputchar
+109 stub _fputwchar
+110 stub _fsopen
+111 stub _fstat
+112 stub _ftime
+113 stub _ftol
+114 stub _fullpath
+115 stub _futime
+116 stub _gcvt
+117 stub _get_osfhandle
+118 stub _getch
+119 stub _getche
+120 stub _getcwd
+121 stub _getdcwd
+122 stub _getdiskfree
+123 stub _getdllprocaddr
+124 stub _getdrive
+125 stub _getdrives
+126 stub _getpid
+127 stub _getsystime
+128 stub _getw
+129 stub _global_unwind2
+130 stub _heapchk
+131 stub _heapmin
+132 stub _heapset
+133 stub _heapwalk
+134 stub _hypot
+135 stub _initterm
+136 stub _iob
+137 stub _isatty
+138 stub _isctype
+139 stub _ismbbalnum
+140 stub _ismbbalpha
+141 stub _ismbbgraph
+142 stub _ismbbkalnum
+143 stub _ismbbkana
+144 stub _ismbbkpunct
+145 stub _ismbblead
+146 stub _ismbbprint
+147 stub _ismbbpunct
+148 stub _ismbbtrail
+149 stub _ismbcalpha
+150 stub _ismbcdigit
+151 stub _ismbchira
+152 stub _ismbckata
+153 stub _ismbcl0
+154 stub _ismbcl1
+155 stub _ismbcl2
+156 stub _ismbclegal
+157 stub _ismbclower
+158 stub _ismbcprint
+159 stub _ismbcspace
+160 stub _ismbcsymbol
+161 stub _ismbcupper
+162 stub _ismbslead
+163 stub _ismbstrail
+164 stub _isnan
+165 stub _itoa
+166 stub _itow
+167 stub _j0
+168 stub _j1
+169 stub _jn
+170 stub _kbhit
+171 stub _lfind
+172 stub _loaddll
+173 stub _local_unwind2
+174 stub _locking
+175 stub _logb
+176 stub _lrotl
+177 stub _lrotr
+178 stub _lsearch
+179 stub _lseek
+180 stub _ltoa
+181 stub _ltow
+182 stub _makepath
+183 stub _matherr
+184 stub _mbbtombc
+185 stub _mbbtype
+186 stub _mbccpy
+187 stub _mbcjistojms
+188 stub _mbcjmstojis
+189 stub _mbclen
+190 stub _mbctohira
+191 stub _mbctokata
+192 stub _mbctolower
+193 stub _mbctombb
+194 stub _mbctoupper
+195 stub _mbctype
+196 stub _mbsbtype
+197 stub _mbscat
+198 stub _mbschr
+199 stub _mbscmp
+200 stub _mbscpy
+201 stub _mbscspn
+202 stub _mbsdec
+203 stub _mbsdup
+204 stub _mbsicmp
+205 stub _mbsinc
+206 stub _mbslen
+207 stub _mbslwr
+208 stub _mbsnbcat
+209 stub _mbsnbcmp
+210 stub _mbsnbcnt
+211 stub _mbsnbcpy
+212 stub _mbsnbicmp
+213 stub _mbsnbset
+214 stub _mbsncat
+215 stub _mbsnccnt
+216 stub _mbsncmp
+217 stub _mbsncpy
+218 stub _mbsnextc
+219 stub _mbsnicmp
+220 stub _mbsninc
+221 stub _mbsnset
+222 stub _mbspbrk
+223 stub _mbsrchr
+224 stub _mbsrev
+225 stub _mbsset
+226 stub _mbsspn
+227 stub _mbsspnp
+228 stub _mbsstr
+229 stub _mbstok
+230 stub _mbstrlen
+231 stub _mbsupr
+232 stub _memccpy
+233 stub _memicmp
+234 stub _mkdir
+235 stub _mktemp
+236 stub _msize
+237 stub _nextafter
+238 stub _onexit
+239 stub _open
+240 stub _open_osfhandle
+241 stub _osmajor_dll
+242 stub _osminor_dll
+243 stub _osmode_dll
+244 stub _osver_dll
+245 stub _osversion_dll
+246 stub _pclose
+247 stub _pctype_dll
+248 stub _pgmptr_dll
+249 stub _pipe
+250 stub _popen
+251 stub _purecall
+252 stub _putch
+253 stub _putenv
+254 stub _putw
+255 stub _pwctype_dll
+256 stub _read
+257 stub _rmdir
+258 stub _rmtmp
+259 stub _rotl
+260 stub _rotr
+261 stub _scalb
+262 stub _searchenv
+263 stub _seterrormode
+264 stub _setjmp
+265 stub _setmode
+266 stub _setsystime
+267 stub _sleep
+268 stub _snprintf
+269 stub _snwprintf
+270 stub _sopen
+271 stub _spawnl
+272 stub _spawnle
+273 stub _spawnlp
+274 stub _spawnlpe
+275 stub _spawnv
+276 stub _spawnve
+277 stub _spawnvp
+278 stub _spawnvpe
+279 stub _splitpath
+280 stub _stat
+281 stub _statusfp
+282 stub _strcmpi
+283 stub _strdate
+284 stub _strdec
+285 stub _strdup
+286 stub _strerror
+287 stub _stricmp
+288 stub _stricoll
+289 stub _strinc
+290 stub _strlwr
+291 stub _strncnt
+292 stub _strnextc
+293 stub _strnicmp
+294 stub _strninc
+295 stub _strnset
+296 stub _strrev
+297 stub _strset
+298 stub _strspnp
+299 stub _strtime
+300 stub _strupr
+301 stub _swab
+302 stub _sys_errlist
+303 stub _sys_nerr_dll
+304 stub _tell
+305 stub _tempnam
+306 stub _timezone_dll
+307 stub _tolower
+308 stub _toupper
+309 stub _tzname
+310 stub _tzset
+311 stub _ultoa
+312 stub _ultow
+313 stub _umask
+314 stub _ungetch
+315 stub _unlink
+316 stub _unloaddll
+317 stub _utime
+318 stub _vsnprintf
+319 stub _vsnwprintf
+320 stub _wcsdup
+321 stub _wcsicmp
+322 stub _wcsicoll
+323 stub _wcslwr
+324 stub _wcsnicmp
+325 stub _wcsnset
+326 stub _wcsrev
+327 stub _wcsset
+328 stub _wcsupr
+329 stub _winmajor_dll
+330 stub _winminor_dll
+331 stub _winver_dll
+332 stub _write
+333 stub _wtoi
+334 stub _wtol
+335 stub _y0
+336 stub _y1
+337 stub _yn
+338 stub abort
+339 stub abs
+340 stub acos
+341 stub asctime
+342 stub asin
+343 stub atan
+344 stub atan2
+345 stub atexit
+346 stub atof
+347 stub atoi
+348 stub atol
+349 stub bsearch
+350 stub calloc
+351 stub ceil
+352 stub clearerr
+353 stub clock
+354 stub cos
+355 stub cosh
+356 stub ctime
+357 stub difftime
+358 stub div
+359 stub exit
+360 stub exp
+361 stub fabs
+362 stub fclose
+363 stub feof
+364 stub ferror
+365 stub fflush
+366 stub fgetc
+367 stub fgetpos
+368 stub fgets
+369 stub fgetwc
+370 stub floor
+371 stub fmod
+372 stub fopen
+373 stub fprintf
+374 stub fputc
+375 stub fputs
+376 stub fputwc
+377 stub fread
+378 stub free
+379 stub freopen
+380 stub frexp
+381 stub fscanf
+382 stub fseek
+383 stub fsetpos
+384 stub ftell
+385 stub fwprintf
+386 stub fwrite
+387 stub fwscanf
+388 stub getc
+389 stub getchar
+390 stub getenv
+391 stub gets
+392 stub gmtime
+393 stub is_wctype
+394 stub isalnum
+395 stub isalpha
+396 stub iscntrl
+397 stub isdigit
+398 stub isgraph
+399 stub isleadbyte
+400 stub islower
+401 stub isprint
+402 stub ispunct
+403 stub isspace
+404 stub isupper
+405 stub iswalnum
+406 stub iswalpha
+407 stub iswascii
+408 stub iswcntrl
+409 stub iswctype
+410 stub iswdigit
+411 stub iswgraph
+412 stub iswlower
+413 stub iswprint
+414 stub iswpunct
+415 stub iswspace
+416 stub iswupper
+417 stub iswxdigit
+418 stub isxdigit
+419 stub labs
+420 stub ldexp
+421 stub ldiv
+422 stub localeconv
+423 stub localtime
+424 stub log
+425 stub log10
+426 stub longjmp
+427 stub malloc
+428 stub mblen
+429 stub mbstowcs
+430 stub mbtowc
+431 stub memchr
+432 stub memcmp
+433 stub memcpy
+434 stub memmove
+435 stub memset
+436 stub mktime
+437 stub modf
+438 stub perror
+439 stub pow
+440 stub printf
+441 stub putc
+442 stub putchar
+443 stub puts
+444 stub qsort
+445 stub raise
+446 stub rand
+447 stub realloc
+448 stub remove
+449 stub rename
+450 stub rewind
+451 stub scanf
+452 stub setbuf
+453 stub setlocale
+454 stub setvbuf
+455 stub signal
+456 stub sin
+457 stub sinh
+458 stub sprintf
+459 stub sqrt
+460 stub srand
+461 stub sscanf
+462 stub strcat
+463 stub strchr
+464 stub strcmp
+465 stub strcoll
+466 stub strcpy
+467 stub strcspn
+468 stub strerror
+469 stub strftime
+470 stub strlen
+471 stub strncat
+472 stub strncmp
+473 stub strncpy
+474 stub strpbrk
+475 stub strrchr
+476 stub strspn
+477 stub strstr
+478 stub strtod
+479 stub strtok
+480 stub strtol
+481 stub strtoul
+482 stub strxfrm
+483 stub swprintf
+484 stub swscanf
+485 stub system
+486 stub tan
+487 stub tanh
+488 stub time
+489 stub tmpfile
+490 stub tmpnam
+491 stub tolower
+492 stub toupper
+493 stub towlower
+494 stub towupper
+495 stub ungetc
+496 stub ungetwc
+497 stub vfprintf
+498 stub vfwprintf
+499 stub vprintf
+500 stub vsprintf
+501 stub vswprintf
+502 stub vwprintf
+503 stub wcscat
+504 stub wcschr
+505 stub wcscmp
+506 stub wcscoll
+507 stub wcscpy
+508 stub wcscspn
+509 stub wcsftime
+510 stub wcslen
+511 stub wcsncat
+512 stub wcsncmp
+513 stub wcsncpy
+514 stub wcspbrk
+515 stub wcsrchr
+516 stub wcsspn
+517 stub wcsstr
+518 stub wcstod
+519 stub wcstok
+520 stub wcstol
+521 stub wcstombs
+522 stub wcstoul
+523 stub wcsxfrm
+524 stub wctomb
+525 stub wprintf
+526 stub wscanf
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 0e23946..9b19564 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -124,7 +124,7 @@
 125 pascal16 CreateMetaFile(ptr) CreateMetaFile
 126 pascal16 CloseMetaFile(word) CloseMetaFile
 127 pascal16 DeleteMetaFile(word) DeleteMetaFile
-128 pascal16 MulDiv(s_word s_word s_word) MulDiv
+128 pascal16 MulDiv(s_word s_word s_word) MulDiv16
 129 pascal16 SaveVisRgn(word) SaveVisRgn
 130 pascal16 RestoreVisRgn(word) RestoreVisRgn
 131 pascal16 InquireVisRgn(word) InquireVisRgn
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 64e9c54..d8b4f31 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -5,27 +5,27 @@
 2   stub ExitKernel
 3   pascal GetVersion() GetVersion
 4   pascal16 LocalInit(word word word) LocalInit
-5   pascal16 LocalAlloc(word word) LocalAlloc
-6   pascal16 LocalReAlloc(word word word) LocalReAlloc
-7   pascal16 LocalFree(word) LocalFree
-8   pascal16 LocalLock(word) LocalLock
-9   pascal16 LocalUnlock(word) LocalUnlock
-10  pascal16 LocalSize(word) LocalSize
-11  pascal16 LocalHandle(word) LocalHandle
-12  pascal16 LocalFlags(word) LocalFlags
-13  pascal16 LocalCompact(word) LocalCompact
+5   pascal16 LocalAlloc(word word) LocalAlloc16
+6   pascal16 LocalReAlloc(word word word) LocalReAlloc16
+7   pascal16 LocalFree(word) LocalFree16
+8   pascal16 LocalLock(word) LocalLock16
+9   pascal16 LocalUnlock(word) LocalUnlock16
+10  pascal16 LocalSize(word) LocalSize16
+11  pascal16 LocalHandle(word) LocalHandle16
+12  pascal16 LocalFlags(word) LocalFlags16
+13  pascal16 LocalCompact(word) LocalCompact16
 14  pascal16 LocalNotify(long) LocalNotify
-15  pascal16 GlobalAlloc(word long) GlobalAlloc
-16  pascal16 GlobalReAlloc(word long word) GlobalReAlloc
-17  pascal16 GlobalFree(word) GlobalFree
-18  pascal GlobalLock(word) WIN16_GlobalLock
-19  pascal16 GlobalUnlock(word) GlobalUnlock
-20  pascal GlobalSize(word) GlobalSize
-21  pascal GlobalHandle(word) GlobalHandle
-22  pascal16 GlobalFlags(word) GlobalFlags
+15  pascal16 GlobalAlloc(word long) GlobalAlloc16
+16  pascal16 GlobalReAlloc(word long word) GlobalReAlloc16
+17  pascal16 GlobalFree(word) GlobalFree16
+18  pascal GlobalLock(word) WIN16_GlobalLock16
+19  pascal16 GlobalUnlock(word) GlobalUnlock16
+20  pascal GlobalSize(word) GlobalSize16
+21  pascal GlobalHandle(word) GlobalHandle16
+22  pascal16 GlobalFlags(word) GlobalFlags16
 23  pascal16 LockSegment(word) LockSegment
 24  pascal16 UnlockSegment(word) UnlockSegment
-25  pascal GlobalCompact(long) GlobalCompact
+25  pascal GlobalCompact(long) GlobalCompact16
 26  pascal16 GlobalFreeAll(word) GlobalFreeAll
 27  stub GetModuleName
 28  stub GlobalMasterHandle
@@ -111,13 +111,13 @@
 112 pascal16 GlobalUnWire(word) GlobalUnWire
 113 equate __AHSHIFT 3
 114 equate __AHINCR 8
-115 pascal OutputDebugString(ptr) OutputDebugString
+115 pascal16 OutputDebugString(ptr) OutputDebugString
 116 stub InitLib
 117 pascal16 OldYield() OldYield
 118 register GetTaskQueueDS() GetTaskQueueDS
 119 register GetTaskQueueES() GetTaskQueueES
 120 stub UndefDynLink
-121 pascal16 LocalShrink(word word) LocalShrink
+121 pascal16 LocalShrink(word word) LocalShrink16
 122 pascal16 IsTaskLocked() IsTaskLocked
 123 stub KbdRst
 124 return EnableKernel 0 0
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 77c095f..fe99170 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -318,24 +318,24 @@
 0312 stub GetWindowsDirectoryW
 0313 stdcall GlobalAddAtomA(long) WIN32_GlobalAddAtomA
 0314 stub GlobalAddAtomW
-0315	stdcall GlobalAlloc(long long)	GlobalAlloc32
-0316 stub GlobalCompact
+0315 stdcall GlobalAlloc(long long) GlobalAlloc32
+0316 stdcall GlobalCompact(long) GlobalCompact32
 0317 stub GlobalDeleteAtom
 0318 stub GlobalFindAtomA
 0319 stub GlobalFindAtomW
 0320 stub GlobalFix
-0321 stub GlobalFlags
-0322 stub GlobalFree
+0321 stdcall GlobalFlags(long) GlobalFlags32
+0322 stdcall GlobalFree(long) GlobalFree32
 0323 stub GlobalGetAtomNameA
 0324 stub GlobalGetAtomNameW
-0325 stub GlobalHandle
-0326 stdcall GlobalLock(long)	GlobalLock32
+0325 stdcall GlobalHandle(ptr) GlobalHandle32
+0326 stdcall GlobalLock(long) GlobalLock32
 0327 stub GlobalMemoryStatus
-0328 stub GlobalReAlloc
-0329 stub GlobalSize
+0328 stdcall GlobalReAlloc(long long long) GlobalReAlloc32
+0329 stdcall GlobalSize(long) GlobalSize32
 0330 stub GlobalUnWire
 0331 stub GlobalUnfix
-0332 stub GlobalUnlock
+0332 stdcall GlobalUnlock(long) GlobalUnlock32
 0333 stub GlobalWire
 0334 stdcall HeapAlloc(long long long) HeapAlloc
 0335 stdcall HeapCompact(long long) HeapCompact
@@ -354,7 +354,7 @@
 0348 stub InterlockedExchange
 0349 stub InterlockedIncrement
 0350 stub InvalidateConsoleDIBits
-0351 stub IsBadCodePtr
+0351 stdcall IsBadCodePtr(ptr long)	WIN32_IsBadCodePtr
 0352 stub IsBadHugeReadPtr
 0353 stub IsBadHugeWritePtr
 0354 stdcall IsBadReadPtr(ptr long)	WIN32_IsBadReadPtr
@@ -374,17 +374,17 @@
 0368 stub LoadLibraryW
 0369 stub LoadModule
 0370 stdcall LoadResource(long long) LoadResource32
-0371	stdcall LocalAlloc(long long)	GlobalAlloc32
-0372 stub LocalCompact
+0371 stdcall LocalAlloc(long long) LocalAlloc32
+0372 stdcall LocalCompact(long) LocalCompact32
 0373 stub LocalFileTimeToFileTime
-0374 stub LocalFlags
-0375 stub LocalFree
-0376 stub LocalHandle
-0377 stdcall LocalLock(long)	GlobalLock32
-0378 stub LocalReAlloc
-0379 stub LocalShrink
-0380 stub LocalSize
-0381 stub LocalUnlock
+0374 stdcall LocalFlags(long) LocalFlags32
+0375 stdcall LocalFree(long) LocalFree32
+0376 stdcall LocalHandle(ptr) LocalHandle32
+0377 stdcall LocalLock(long) LocalLock32
+0378 stdcall LocalReAlloc(long long long) LocalReAlloc32
+0379 stdcall LocalShrink(long long) LocalShrink32
+0380 stdcall LocalSize(long) LocalSize32
+0381 stdcall LocalUnlock(long) LocalUnlock32
 0382 stub LockFile
 0383 stub LockFileEx
 0384 stub LockResource
@@ -394,7 +394,7 @@
 0388 stub MoveFileExA
 0389 stub MoveFileExW
 0390 stub MoveFileW
-0391 stub MulDiv
+0391 stdcall MulDiv(long long long) MulDiv32
 0392 stdcall MultiByteToWideChar(long long ptr long ptr long) MultiByteToWideChar
 0393 stub OpenConsoleW
 0394 stub OpenEventA
diff --git a/if1632/ntdll.spec b/if1632/ntdll.spec
new file mode 100644
index 0000000..ea49e96
--- /dev/null
+++ b/if1632/ntdll.spec
@@ -0,0 +1,954 @@
+name	ntdll
+type	win32
+base	0
+
+001 stub CsrAllocateCaptureBuffer
+002 stub CsrAllocateCapturePointer
+003 stub CsrAllocateMessagePointer
+004 stub CsrCaptureMessageBuffer
+005 stub CsrCaptureMessageString
+006 stub CsrCaptureTimeout
+007 stub CsrClientCallServer
+008 stub CsrClientConnectToServer
+009 stub CsrClientMaxMessage
+010 stub CsrClientSendMessage
+011 stub CsrClientThreadConnect
+012 stub CsrFreeCaptureBuffer
+013 stub CsrIdentifyAlertableThread
+014 stub CsrNewThread
+015 stub CsrProbeForRead
+016 stub CsrProbeForWrite
+017 stub CsrSetPriorityClass
+018 stub CsrpProcessCallbackRequest
+019 stub DbgBreakPoint
+020 stub DbgPrint
+021 stub DbgPrompt
+022 stub DbgSsHandleKmApiMsg
+023 stub DbgSsInitialize
+024 stub DbgUiConnectToDbg
+025 stub DbgUiContinue
+026 stub DbgUiWaitStateChange
+027 stub DbgUserBreakPoint
+028 stub KiUserApcDispatcher
+029 stub KiUserCallbackDispatcher
+030 stub KiUserExceptionDispatcher
+031 stub LdrAccessResource
+032 stub LdrDisableThreadCalloutsForDll
+033 stub LdrEnumResources
+034 stub LdrFindEntryForAddress
+035 stub LdrFindResourceDirectory_U
+036 stub LdrFindResource_U
+037 stub LdrGetDllHandle
+038 stub LdrGetProcedureAddress
+039 stub LdrInitializeThunk
+040 stub LdrLoadDll
+041 stub LdrProcessRelocationBlock
+042 stub LdrQueryImageFileExecutionOptions
+043 stub LdrQueryProcessModuleInformation
+044 stub LdrShutdownProcess
+045 stub LdrShutdownThread
+046 stub LdrUnloadDll
+047 stub LdrVerifyImageMatchesChecksum
+048 stub NPXEMULATORTABLE
+049 stub NlsMbCodePageTag
+050 stub NlsMbOemCodePageTag
+051 stub NtAcceptConnectPort
+052 stub NtAccessCheck
+053 stub NtAccessCheckAndAuditAlarm
+054 stub NtAdjustGroupsToken
+055 stub NtAdjustPrivilegesToken
+056 stub NtAlertResumeThread
+057 stub NtAlertThread
+058 stub NtAllocateLocallyUniqueId
+059 stub NtAllocateUuids
+060 stub NtAllocateVirtualMemory
+061 stub NtCallbackReturn
+062 stub NtCancelIoFile
+063 stub NtCancelTimer
+064 stub NtClearEvent
+065 stub NtClose
+066 stub NtCloseObjectAuditAlarm
+067 stub NtCompleteConnectPort
+068 stub NtConnectPort
+069 stub NtContinue
+070 stub NtCreateDirectoryObject
+071 stub NtCreateEvent
+072 stub NtCreateEventPair
+073 stub NtCreateFile
+074 stub NtCreateIoCompletion
+075 stub NtCreateKey
+076 stub NtCreateMailslotFile
+077 stub NtCreateMutant
+078 stub NtCreateNamedPipeFile
+079 stub NtCreatePagingFile
+080 stub NtCreatePort
+081 stub NtCreateProcess
+082 stub NtCreateProfile
+083 stub NtCreateSection
+084 stub NtCreateSemaphore
+085 stub NtCreateSymbolicLinkObject
+086 stub NtCreateThread
+087 stub NtCreateTimer
+088 stub NtCreateToken
+089 stub NtCurrentTeb
+090 stub NtDelayExecution
+091 stub NtDeleteFile
+092 stub NtDeleteKey
+093 stub NtDeleteValueKey
+094 stub NtDeviceIoControlFile
+095 stub NtDisplayString
+096 stub NtDuplicateObject
+097 stub NtDuplicateToken
+098 stub NtEnumerateBus
+099 stub NtEnumerateKey
+100 stub NtEnumerateValueKey
+101 stub NtExtendSection
+102 stub NtFlushBuffersFile
+103 stub NtFlushInstructionCache
+104 stub NtFlushKey
+105 stub NtFlushVirtualMemory
+106 stub NtFlushWriteBuffer
+107 stub NtFreeVirtualMemory
+108 stub NtFsControlFile
+109 stub NtGetContextThread
+110 stub NtGetPlugPlayEvent
+111 stub NtGetTickCount
+112 stub NtImpersonateClientOfPort
+113 stub NtImpersonateThread
+114 stub NtInitializeRegistry
+115 stub NtListenPort
+116 stub NtLoadDriver
+117 stub NtLoadKey
+118 stub NtLockFile
+119 stub NtLockVirtualMemory
+120 stub NtMakeTemporaryObject
+121 stub NtMapViewOfSection
+122 stub NtNotifyChangeDirectoryFile
+123 stub NtNotifyChangeKey
+124 stub NtOpenDirectoryObject
+125 stub NtOpenEvent
+126 stub NtOpenEventPair
+127 stub NtOpenFile
+128 stub NtOpenIoCompletion
+129 stub NtOpenKey
+130 stub NtOpenMutant
+131 stub NtOpenObjectAuditAlarm
+132 stub NtOpenProcess
+133 stub NtOpenProcessToken
+134 stub NtOpenSection
+135 stub NtOpenSemaphore
+136 stub NtOpenSymbolicLinkObject
+137 stub NtOpenThread
+138 stub NtOpenThreadToken
+139 stub NtOpenTimer
+140 stub NtPlugPlayControl
+141 stub NtPrivilegeCheck
+142 stub NtPrivilegeObjectAuditAlarm
+143 stub NtPrivilegedServiceAuditAlarm
+144 stub NtProtectVirtualMemory
+145 stub NtPulseEvent
+146 stub NtQueryAttributesFile
+147 stub NtQueryDefaultLocale
+148 stub NtQueryDirectoryFile
+149 stub NtQueryDirectoryObject
+150 stub NtQueryEaFile
+151 stub NtQueryEvent
+152 stub NtQueryInformationFile
+153 stub NtQueryInformationPort
+154 stub NtQueryInformationProcess
+155 stub NtQueryInformationThread
+156 stub NtQueryInformationToken
+157 stub NtQueryIntervalProfile
+158 stub NtQueryIoCompletion
+159 stub NtQueryKey
+160 stub NtQueryMutant
+161 stub NtQueryObject
+162 stub NtQueryPerformanceCounter
+163 stub NtQuerySection
+164 stub NtQuerySecurityObject
+165 stub NtQuerySemaphore
+166 stub NtQuerySymbolicLinkObject
+167 stub NtQuerySystemEnvironmentValue
+168 stub NtQuerySystemInformation
+169 stub NtQuerySystemTime
+170 stub NtQueryTimer
+171 stub NtQueryTimerResolution
+172 stub NtQueryValueKey
+173 stub NtQueryVirtualMemory
+174 stub NtQueryVolumeInformationFile
+175 stub NtRaiseException
+176 stub NtRaiseHardError
+177 stub NtReadFile
+178 stub NtReadRequestData
+179 stub NtReadVirtualMemory
+180 stub NtRegisterNewDevice
+181 stub NtRegisterThreadTerminatePort
+182 stub NtReleaseMutant
+183 stub NtReleaseProcessMutant
+184 stub NtReleaseSemaphore
+185 stub NtRemoveIoCompletion
+186 stub NtReplaceKey
+187 stub NtReplyPort
+188 stub NtReplyWaitReceivePort
+189 stub NtReplyWaitReplyPort
+190 stub NtRequestPort
+191 stub NtRequestWaitReplyPort
+192 stub NtResetEvent
+193 stub NtRestoreKey
+194 stub NtResumeThread
+195 stub NtSaveKey
+196 stub NtSetContextThread
+197 stub NtSetDefaultHardErrorPort
+198 stub NtSetDefaultLocale
+199 stub NtSetEaFile
+200 stub NtSetEvent
+201 stub NtSetHighEventPair
+202 stub NtSetHighWaitLowEventPair
+203 stub NtSetHighWaitLowThread
+204 stub NtSetInformationFile
+205 stub NtSetInformationKey
+206 stub NtSetInformationObject
+207 stub NtSetInformationProcess
+208 stub NtSetInformationThread
+209 stub NtSetInformationToken
+210 stub NtSetIntervalProfile
+211 stub NtSetIoCompletion
+212 stub NtSetLdtEntries
+213 stub NtSetLowEventPair
+214 stub NtSetLowWaitHighEventPair
+215 stub NtSetLowWaitHighThread
+216 stub NtSetSecurityObject
+217 stub NtSetSystemEnvironmentValue
+218 stub NtSetSystemInformation
+219 stub NtSetSystemPowerState
+220 stub NtSetSystemTime
+221 stub NtSetTimer
+222 stub NtSetTimerResolution
+223 stub NtSetValueKey
+224 stub NtSetVolumeInformationFile
+225 stub NtShutdownSystem
+226 stub NtStartProfile
+227 stub NtStopProfile
+228 stub NtSuspendThread
+229 stub NtSystemDebugControl
+230 stub NtTerminateProcess
+231 stub NtTerminateThread
+232 stub NtTestAlert
+233 stub NtUnloadDriver
+234 stub NtUnloadKey
+235 stub NtUnlockFile
+236 stub NtUnlockVirtualMemory
+237 stub NtUnmapViewOfSection
+238 stub NtVdmControl
+239 stub NtW32Call
+240 stub NtWaitForMultipleObjects
+241 stub NtWaitForProcessMutant
+242 stub NtWaitForSingleObject
+243 stub NtWaitHighEventPair
+244 stub NtWaitLowEventPair
+245 stub NtWriteFile
+246 stub NtWriteRequestData
+247 stub NtWriteVirtualMemory
+248 stub PfxFindPrefix
+249 stub PfxInitialize
+250 stub PfxInsertPrefix
+251 stub PfxRemovePrefix
+252 stub RestoreEm87Context
+253 stub RtlAbortRXact
+254 stub RtlAbsoluteToSelfRelativeSD
+255 stub RtlAcquirePebLock
+256 stub RtlAcquireResourceExclusive
+257 stub RtlAcquireResourceShared
+258 stub RtlAddAccessAllowedAce
+259 stub RtlAddAccessDeniedAce
+260 stub RtlAddAce
+261 stub RtlAddActionToRXact
+262 stub RtlAddAttributeActionToRXact
+263 stub RtlAddAuditAccessAce
+264 stub RtlAdjustPrivilege
+265 stub RtlAllocateAndInitializeSid
+266 stub RtlAllocateHeap
+267 stub RtlAnsiCharToUnicodeChar
+268 stub RtlAnsiStringToUnicodeSize
+269 stub RtlAnsiStringToUnicodeString
+270 stub RtlAppendAsciizToString
+271 stub RtlAppendStringToString
+272 stub RtlAppendUnicodeStringToString
+273 stub RtlAppendUnicodeToString
+274 stub RtlApplyRXact
+275 stub RtlApplyRXactNoFlush
+276 stub RtlAreAllAccessesGranted
+277 stub RtlAreAnyAccessesGranted
+278 stub RtlAreBitsClear
+279 stub RtlAreBitsSet
+280 stub RtlAssert
+281 stub RtlCaptureStackBackTrace
+282 stub RtlCharToInteger
+283 stub RtlCheckRegistryKey
+284 stub RtlClearAllBits
+285 stub RtlClearBits
+286 stub RtlCompactHeap
+287 stub RtlCompareMemory
+288 stub RtlCompareMemoryUlong
+289 stub RtlCompareString
+290 stub RtlCompareUnicodeString
+291 stub RtlCompressBuffer
+292 stub RtlConsoleMultiByteToUnicodeN
+293 stub RtlConvertExclusiveToShared
+294 stub RtlConvertLongToLargeInteger
+295 stub RtlConvertSharedToExclusive
+296 stub RtlConvertSidToUnicodeString
+297 stub RtlConvertUiListToApiList
+298 stub RtlConvertUlongToLargeInteger
+299 stub RtlCopyLuid
+300 stub RtlCopyLuidAndAttributesArray
+301 stub RtlCopySecurityDescriptor
+302 stub RtlCopySid
+303 stub RtlCopySidAndAttributesArray
+304 stub RtlCopyString
+305 stub RtlCopyUnicodeString
+306 stub RtlCreateAcl
+307 stub RtlCreateAndSetSD
+308 stub RtlCreateEnvironment
+309 stub RtlCreateHeap
+310 stub RtlCreateProcessParameters
+311 stub RtlCreateQueryDebugBuffer
+312 stub RtlCreateRegistryKey
+313 stub RtlCreateSecurityDescriptor
+314 stub RtlCreateTagHeap
+315 stub RtlCreateUnicodeString
+316 stub RtlCreateUnicodeStringFromAsciiz
+317 stub RtlCreateUserProcess
+318 stub RtlCreateUserSecurityObject
+319 stub RtlCreateUserThread
+320 stub RtlCustomCPToUnicodeN
+321 stub RtlCutoverTimeToSystemTime
+322 stub RtlDeNormalizeProcessParams
+323 stub RtlDecompressBuffer
+324 stub RtlDecompressFragment
+325 stub RtlDelete
+326 stub RtlDeleteAce
+327 stub RtlDeleteCriticalSection
+328 stub RtlDeleteElementGenericTable
+329 stub RtlDeleteRegistryValue
+330 stub RtlDeleteResource
+331 stub RtlDeleteSecurityObject
+332 stub RtlDestroyEnvironment
+333 stub RtlDestroyHeap
+334 stub RtlDestroyProcessParameters
+335 stub RtlDestroyQueryDebugBuffer
+336 stub RtlDetermineDosPathNameType_U
+337 stub RtlDoesFileExists_U
+338 stub RtlDosPathNameToNtPathName_U
+339 stub RtlDosSearchPath_U
+340 stub RtlDumpResource
+341 stub RtlEnlargedIntegerMultiply
+342 stub RtlEnlargedUnsignedDivide
+343 stub RtlEnlargedUnsignedMultiply
+344 stub RtlEnterCriticalSection
+345 stub RtlEnumProcessHeaps
+346 stub RtlEnumerateGenericTable
+347 stub RtlEnumerateGenericTableWithoutSplaying
+348 stub RtlEqualComputerName
+349 stub RtlEqualDomainName
+350 stub RtlEqualLuid
+351 stub RtlEqualPrefixSid
+352 stub RtlEqualSid
+353 stub RtlEqualString
+354 stub RtlEqualUnicodeString
+355 stub RtlEraseUnicodeString
+356 stub RtlExpandEnvironmentStrings_U
+357 stub RtlExtendHeap
+358 stub RtlExtendedIntegerMultiply
+359 stub RtlExtendedLargeIntegerDivide
+360 stub RtlExtendedMagicDivide
+361 stub RtlFillMemory
+362 stub RtlFillMemoryUlong
+363 stub RtlFindClearBits
+364 stub RtlFindClearBitsAndSet
+365 stub RtlFindLongestRunClear
+366 stub RtlFindLongestRunSet
+367 stub RtlFindMessage
+368 stub RtlFindSetBits
+369 stub RtlFindSetBitsAndClear
+370 stub RtlFirstFreeAce
+371 stub RtlFormatCurrentUserKeyPath
+372 stub RtlFormatMessage
+373 stub RtlFreeAnsiString
+374 stub RtlFreeHeap
+375 stub RtlFreeOemString
+376 stub RtlFreeSid
+377 stub RtlFreeUnicodeString
+378 stub RtlGenerate8dot3Name
+379 stub RtlGetAce
+380 stub RtlGetCallersAddress
+381 stub RtlGetCompressionWorkSpaceSize
+382 stub RtlGetControlSecurityDescriptor
+383 stub RtlGetCurrentDirectory_U
+384 stub RtlGetDaclSecurityDescriptor
+385 stub RtlGetElementGenericTable
+386 stub RtlGetFullPathName_U
+387 stub RtlGetGroupSecurityDescriptor
+388 stub RtlGetLongestNtPathLength
+389 stub RtlGetNtGlobalFlags
+390 stub RtlGetNtProductType
+391 stub RtlGetOwnerSecurityDescriptor
+392 stub RtlGetProcessHeaps
+393 stub RtlGetSaclSecurityDescriptor
+394 stub RtlGetUserInfoHeap
+395 stub RtlIdentifierAuthoritySid
+396 stub RtlImageDirectoryEntryToData
+397 stub RtlImageNtHeader
+398 stub RtlImpersonateSelf
+399 stub RtlInitAnsiString
+400 stub RtlInitCodePageTable
+401 stub RtlInitNlsTables
+402 stub RtlInitString
+403 stub RtlInitUnicodeString
+404 stub RtlInitializeBitMap
+405 stub RtlInitializeContext
+406 stub RtlInitializeCriticalSection
+407 stub RtlInitializeGenericTable
+408 stub RtlInitializeRXact
+409 stub RtlInitializeResource
+410 stub RtlInitializeSid
+411 stub RtlInsertElementGenericTable
+412 stub RtlIntegerToChar
+413 stub RtlIntegerToUnicodeString
+414 stub RtlIsDosDeviceName_U
+415 stub RtlIsGenericTableEmpty
+416 stub RtlIsNameLegalDOS8Dot3
+417 stub RtlIsTextUnicode
+418 stub RtlLargeIntegerAdd
+419 stub RtlLargeIntegerArithmeticShift
+420 stub RtlLargeIntegerDivide
+421 stub RtlLargeIntegerNegate
+422 stub RtlLargeIntegerShiftLeft
+423 stub RtlLargeIntegerShiftRight
+424 stub RtlLargeIntegerSubtract
+425 stub RtlLargeIntegerToChar
+426 stub RtlLeaveCriticalSection
+427 stub RtlLengthRequiredSid
+428 stub RtlLengthSecurityDescriptor
+429 stub RtlLengthSid
+430 stub RtlLocalTimeToSystemTime
+431 stub RtlLockHeap
+432 stub RtlLookupElementGenericTable
+433 stub RtlMakeSelfRelativeSD
+434 stub RtlMapGenericMask
+435 stub RtlMoveMemory
+436 stub RtlMultiByteToUnicodeN
+437 stub RtlMultiByteToUnicodeSize
+438 stub RtlNewInstanceSecurityObject
+439 stub RtlNewSecurityGrantedAccess
+440 stub RtlNewSecurityObject
+441 stub RtlNormalizeProcessParams
+442 stub RtlNtStatusToDosError
+443 stub RtlNumberGenericTableElements
+444 stub RtlNumberOfClearBits
+445 stub RtlNumberOfSetBits
+446 stub RtlOemStringToUnicodeSize
+447 stub RtlOemStringToUnicodeString
+448 stub RtlOemToUnicodeN
+449 stub RtlOpenCurrentUser
+450 stub RtlPcToFileHeader
+451 stub RtlPrefixString
+452 stub RtlPrefixUnicodeString
+453 stub RtlProtectHeap
+454 stub RtlQueryEnvironmentVariable_U
+455 stub RtlQueryInformationAcl
+456 stub RtlQueryProcessBackTraceInformation
+457 stub RtlQueryProcessDebugInformation
+458 stub RtlQueryProcessHeapInformation
+459 stub RtlQueryProcessLockInformation
+460 stub RtlQueryRegistryValues
+461 stub RtlQuerySecurityObject
+462 stub RtlQueryTagHeap
+463 stub RtlQueryTimeZoneInformation
+464 stub RtlRaiseException
+465 stub RtlRaiseStatus
+466 stub RtlRandom
+467 stub RtlReAllocateHeap
+468 stub RtlRealPredecessor
+469 stub RtlRealSuccessor
+470 stub RtlReleasePebLock
+471 stub RtlReleaseResource
+472 stub RtlRemoteCall
+473 stub RtlResetRtlTranslations
+474 stub RtlRunDecodeUnicodeString
+475 stub RtlRunEncodeUnicodeString
+476 stub RtlSecondsSince1970ToTime
+477 stub RtlSecondsSince1980ToTime
+478 stub RtlSelfRelativeToAbsoluteSD
+479 stub RtlSetAllBits
+480 stub RtlSetBits
+481 stub RtlSetCurrentDirectory_U
+482 stub RtlSetCurrentEnvironment
+483 stub RtlSetDaclSecurityDescriptor
+484 stub RtlSetEnvironmentVariable
+485 stub RtlSetGroupSecurityDescriptor
+486 stub RtlSetInformationAcl
+487 stub RtlSetOwnerSecurityDescriptor
+488 stub RtlSetSaclSecurityDescriptor
+489 stub RtlSetSecurityObject
+490 stub RtlSetTimeZoneInformation
+491 stub RtlSetUserFlagsHeap
+492 stub RtlSetUserValueHeap
+493 stub RtlSizeHeap
+494 stub RtlSplay
+495 stub RtlStartRXact
+496 stub RtlSubAuthorityCountSid
+497 stub RtlSubAuthoritySid
+498 stub RtlSubtreePredecessor
+499 stub RtlSubtreeSuccessor
+500 stub RtlSystemTimeToLocalTime
+501 stub RtlTimeFieldsToTime
+502 stub RtlTimeToElapsedTimeFields
+503 stub RtlTimeToSecondsSince1970
+504 stub RtlTimeToSecondsSince1980
+505 stub RtlTimeToTimeFields
+506 stub RtlUnicodeStringToAnsiSize
+507 stub RtlUnicodeStringToAnsiString
+508 stub RtlUnicodeStringToCountedOemString
+509 stub RtlUnicodeStringToInteger
+510 stub RtlUnicodeStringToOemSize
+511 stub RtlUnicodeStringToOemString
+512 stub RtlUnicodeToCustomCPN
+513 stub RtlUnicodeToMultiByteN
+514 stub RtlUnicodeToMultiByteSize
+515 stub RtlUnicodeToOemN
+516 stub RtlUniform
+517 stub RtlUnlockHeap
+518 stub RtlUnwind
+519 stub RtlUpcaseUnicodeChar
+520 stub RtlUpcaseUnicodeString
+521 stub RtlUpcaseUnicodeStringToAnsiString
+522 stub RtlUpcaseUnicodeStringToCountedOemString
+523 stub RtlUpcaseUnicodeStringToOemString
+524 stub RtlUpcaseUnicodeToCustomCPN
+525 stub RtlUpcaseUnicodeToMultiByteN
+526 stub RtlUpcaseUnicodeToOemN
+527 stub RtlUpperChar
+528 stub RtlUpperString
+529 stub RtlUsageHeap
+530 stub RtlValidAcl
+531 stub RtlValidSecurityDescriptor
+532 stub RtlValidSid
+533 stub RtlValidateHeap
+534 stub RtlValidateProcessHeaps
+535 stub RtlWalkHeap
+536 stub RtlWriteRegistryValue
+537 stub RtlZeroHeap
+538 stub RtlZeroMemory
+539 stub RtlpInitializeRtl
+540 stub RtlpNtCreateKey
+541 stub RtlpNtEnumerateSubKey
+542 stub RtlpNtMakeTemporaryKey
+543 stub RtlpNtOpenKey
+544 stub RtlpNtQueryValueKey
+545 stub RtlpNtSetValueKey
+546 stub RtlpUnWaitCriticalSection
+547 stub RtlpWaitForCriticalSection
+548 stub RtlxAnsiStringToUnicodeSize
+549 stub RtlxOemStringToUnicodeSize
+550 stub RtlxUnicodeStringToAnsiSize
+551 stub RtlxUnicodeStringToOemSize
+552 stub SaveEm87Context
+553 stub ZwAcceptConnectPort
+554 stub ZwAccessCheck
+555 stub ZwAccessCheckAndAuditAlarm
+556 stub ZwAdjustGroupsToken
+557 stub ZwAdjustPrivilegesToken
+558 stub ZwAlertResumeThread
+559 stub ZwAlertThread
+560 stub ZwAllocateLocallyUniqueId
+561 stub ZwAllocateUuids
+562 stub ZwAllocateVirtualMemory
+563 stub ZwCallbackReturn
+564 stub ZwCancelIoFile
+565 stub ZwCancelTimer
+566 stub ZwClearEvent
+567 stub ZwClose
+568 stub ZwCloseObjectAuditAlarm
+569 stub ZwCompleteConnectPort
+570 stub ZwConnectPort
+571 stub ZwContinue
+572 stub ZwCreateDirectoryObject
+573 stub ZwCreateEvent
+574 stub ZwCreateEventPair
+575 stub ZwCreateFile
+576 stub ZwCreateIoCompletion
+577 stub ZwCreateKey
+578 stub ZwCreateMailslotFile
+579 stub ZwCreateMutant
+580 stub ZwCreateNamedPipeFile
+581 stub ZwCreatePagingFile
+582 stub ZwCreatePort
+583 stub ZwCreateProcess
+584 stub ZwCreateProfile
+585 stub ZwCreateSection
+586 stub ZwCreateSemaphore
+587 stub ZwCreateSymbolicLinkObject
+588 stub ZwCreateThread
+589 stub ZwCreateTimer
+590 stub ZwCreateToken
+591 stub ZwDelayExecution
+592 stub ZwDeleteFile
+593 stub ZwDeleteKey
+594 stub ZwDeleteValueKey
+595 stub ZwDeviceIoControlFile
+596 stub ZwDisplayString
+597 stub ZwDuplicateObject
+598 stub ZwDuplicateToken
+599 stub ZwEnumerateBus
+600 stub ZwEnumerateKey
+601 stub ZwEnumerateValueKey
+602 stub ZwExtendSection
+603 stub ZwFlushBuffersFile
+604 stub ZwFlushInstructionCache
+605 stub ZwFlushKey
+606 stub ZwFlushVirtualMemory
+607 stub ZwFlushWriteBuffer
+608 stub ZwFreeVirtualMemory
+609 stub ZwFsControlFile
+610 stub ZwGetContextThread
+611 stub ZwGetPlugPlayEvent
+612 stub ZwGetTickCount
+613 stub ZwImpersonateClientOfPort
+614 stub ZwImpersonateThread
+615 stub ZwInitializeRegistry
+616 stub ZwListenPort
+617 stub ZwLoadDriver
+618 stub ZwLoadKey
+619 stub ZwLockFile
+620 stub ZwLockVirtualMemory
+621 stub ZwMakeTemporaryObject
+622 stub ZwMapViewOfSection
+623 stub ZwNotifyChangeDirectoryFile
+624 stub ZwNotifyChangeKey
+625 stub ZwOpenDirectoryObject
+626 stub ZwOpenEvent
+627 stub ZwOpenEventPair
+628 stub ZwOpenFile
+629 stub ZwOpenIoCompletion
+630 stub ZwOpenKey
+631 stub ZwOpenMutant
+632 stub ZwOpenObjectAuditAlarm
+633 stub ZwOpenProcess
+634 stub ZwOpenProcessToken
+635 stub ZwOpenSection
+636 stub ZwOpenSemaphore
+637 stub ZwOpenSymbolicLinkObject
+638 stub ZwOpenThread
+639 stub ZwOpenThreadToken
+640 stub ZwOpenTimer
+641 stub ZwPlugPlayControl
+642 stub ZwPrivilegeCheck
+643 stub ZwPrivilegeObjectAuditAlarm
+644 stub ZwPrivilegedServiceAuditAlarm
+645 stub ZwProtectVirtualMemory
+646 stub ZwPulseEvent
+647 stub ZwQueryAttributesFile
+648 stub ZwQueryDefaultLocale
+649 stub ZwQueryDirectoryFile
+650 stub ZwQueryDirectoryObject
+651 stub ZwQueryEaFile
+652 stub ZwQueryEvent
+653 stub ZwQueryInformationFile
+654 stub ZwQueryInformationPort
+655 stub ZwQueryInformationProcess
+656 stub ZwQueryInformationThread
+657 stub ZwQueryInformationToken
+658 stub ZwQueryIntervalProfile
+659 stub ZwQueryIoCompletion
+660 stub ZwQueryKey
+661 stub ZwQueryMutant
+662 stub ZwQueryObject
+663 stub ZwQueryPerformanceCounter
+664 stub ZwQuerySection
+665 stub ZwQuerySecurityObject
+666 stub ZwQuerySemaphore
+667 stub ZwQuerySymbolicLinkObject
+668 stub ZwQuerySystemEnvironmentValue
+669 stub ZwQuerySystemInformation
+670 stub ZwQuerySystemTime
+671 stub ZwQueryTimer
+672 stub ZwQueryTimerResolution
+673 stub ZwQueryValueKey
+674 stub ZwQueryVirtualMemory
+675 stub ZwQueryVolumeInformationFile
+676 stub ZwRaiseException
+677 stub ZwRaiseHardError
+678 stub ZwReadFile
+679 stub ZwReadRequestData
+680 stub ZwReadVirtualMemory
+681 stub ZwRegisterNewDevice
+682 stub ZwRegisterThreadTerminatePort
+683 stub ZwReleaseMutant
+684 stub ZwReleaseProcessMutant
+685 stub ZwReleaseSemaphore
+686 stub ZwRemoveIoCompletion
+687 stub ZwReplaceKey
+688 stub ZwReplyPort
+689 stub ZwReplyWaitReceivePort
+690 stub ZwReplyWaitReplyPort
+691 stub ZwRequestPort
+692 stub ZwRequestWaitReplyPort
+693 stub ZwResetEvent
+694 stub ZwRestoreKey
+695 stub ZwResumeThread
+696 stub ZwSaveKey
+697 stub ZwSetContextThread
+698 stub ZwSetDefaultHardErrorPort
+699 stub ZwSetDefaultLocale
+700 stub ZwSetEaFile
+701 stub ZwSetEvent
+702 stub ZwSetHighEventPair
+703 stub ZwSetHighWaitLowEventPair
+704 stub ZwSetHighWaitLowThread
+705 stub ZwSetInformationFile
+706 stub ZwSetInformationKey
+707 stub ZwSetInformationObject
+708 stub ZwSetInformationProcess
+709 stub ZwSetInformationThread
+710 stub ZwSetInformationToken
+711 stub ZwSetIntervalProfile
+712 stub ZwSetIoCompletion
+713 stub ZwSetLdtEntries
+714 stub ZwSetLowEventPair
+715 stub ZwSetLowWaitHighEventPair
+716 stub ZwSetLowWaitHighThread
+717 stub ZwSetSecurityObject
+718 stub ZwSetSystemEnvironmentValue
+719 stub ZwSetSystemInformation
+720 stub ZwSetSystemPowerState
+721 stub ZwSetSystemTime
+722 stub ZwSetTimer
+723 stub ZwSetTimerResolution
+724 stub ZwSetValueKey
+725 stub ZwSetVolumeInformationFile
+726 stub ZwShutdownSystem
+727 stub ZwStartProfile
+728 stub ZwStopProfile
+729 stub ZwSuspendThread
+730 stub ZwSystemDebugControl
+731 stub ZwTerminateProcess
+732 stub ZwTerminateThread
+733 stub ZwTestAlert
+734 stub ZwUnloadDriver
+735 stub ZwUnloadKey
+736 stub ZwUnlockFile
+737 stub ZwUnlockVirtualMemory
+738 stub ZwUnmapViewOfSection
+739 stub ZwVdmControl
+740 stub ZwW32Call
+741 stub ZwWaitForMultipleObjects
+742 stub ZwWaitForProcessMutant
+743 stub ZwWaitForSingleObject
+744 stub ZwWaitHighEventPair
+745 stub ZwWaitLowEventPair
+746 stub ZwWriteFile
+747 stub ZwWriteRequestData
+748 stub ZwWriteVirtualMemory
+749 stub _CIpow
+750 stub __eCommonExceptions
+751 stub __eEmulatorInit
+752 stub __eF2XM1
+753 stub __eFABS
+754 stub __eFADD32
+755 stub __eFADD64
+756 stub __eFADDPreg
+757 stub __eFADDreg
+758 stub __eFADDtop
+759 stub __eFCHS
+760 stub __eFCOM
+761 stub __eFCOM32
+762 stub __eFCOM64
+763 stub __eFCOMP
+764 stub __eFCOMP32
+765 stub __eFCOMP64
+766 stub __eFCOMPP
+767 stub __eFCOS
+768 stub __eFDECSTP
+769 stub __eFDIV32
+770 stub __eFDIV64
+771 stub __eFDIVPreg
+772 stub __eFDIVR32
+773 stub __eFDIVR64
+774 stub __eFDIVRPreg
+775 stub __eFDIVRreg
+776 stub __eFDIVRtop
+777 stub __eFDIVreg
+778 stub __eFDIVtop
+779 stub __eFFREE
+780 stub __eFIADD16
+781 stub __eFIADD32
+782 stub __eFICOM16
+783 stub __eFICOM32
+784 stub __eFICOMP16
+785 stub __eFICOMP32
+786 stub __eFIDIV16
+787 stub __eFIDIV32
+788 stub __eFIDIVR16
+789 stub __eFIDIVR32
+790 stub __eFILD16
+791 stub __eFILD32
+792 stub __eFILD64
+793 stub __eFIMUL16
+794 stub __eFIMUL32
+795 stub __eFINCSTP
+796 stub __eFINIT
+797 stub __eFIST16
+798 stub __eFIST32
+799 stub __eFISTP16
+800 stub __eFISTP32
+801 stub __eFISTP64
+802 stub __eFISUB16
+803 stub __eFISUB32
+804 stub __eFISUBR16
+805 stub __eFISUBR32
+806 stub __eFLD1
+807 stub __eFLD32
+808 stub __eFLD64
+809 stub __eFLD80
+810 stub __eFLDCW
+811 stub __eFLDENV
+812 stub __eFLDL2E
+813 stub __eFLDLN2
+814 stub __eFLDPI
+815 stub __eFLDZ
+816 stub __eFMUL32
+817 stub __eFMUL64
+818 stub __eFMULPreg
+819 stub __eFMULreg
+820 stub __eFMULtop
+821 stub __eFPATAN
+822 stub __eFPREM
+823 stub __eFPREM1
+824 stub __eFPTAN
+825 stub __eFRNDINT
+826 stub __eFRSTOR
+827 stub __eFSAVE
+828 stub __eFSCALE
+829 stub __eFSIN
+830 stub __eFSQRT
+831 stub __eFST
+832 stub __eFST32
+833 stub __eFST64
+834 stub __eFSTCW
+835 stub __eFSTENV
+836 stub __eFSTP
+837 stub __eFSTP32
+838 stub __eFSTP64
+839 stub __eFSTP80
+840 stub __eFSTSW
+841 stub __eFSUB32
+842 stub __eFSUB64
+843 stub __eFSUBPreg
+844 stub __eFSUBR32
+845 stub __eFSUBR64
+846 stub __eFSUBRPreg
+847 stub __eFSUBRreg
+848 stub __eFSUBRtop
+849 stub __eFSUBreg
+850 stub __eFSUBtop
+851 stub __eFTST
+852 stub __eFUCOM
+853 stub __eFUCOMP
+854 stub __eFUCOMPP
+855 stub __eFXAM
+856 stub __eFXCH
+857 stub __eFXTRACT
+858 stub __eFYL2X
+859 stub __eFYL2XP1
+860 stub __eGetStatusWord
+861 stub _alloca_probe
+862 stub _chkstk
+863 stub _fltused
+864 stub _ftol
+865 stub _itoa
+866 stub _ltoa
+867 stub _memccpy
+868 stub _memicmp
+869 stub _snprintf
+870 stub _snwprintf
+871 stub _splitpath
+872 stub _strcmpi
+873 stub _stricmp
+874 stub _strlwr
+875 stub _strnicmp
+876 stub _strupr
+877 stub _ultoa
+878 stub _vsnprintf
+879 stub _wcsicmp
+880 stub _wcslwr
+881 stub _wcsnicmp
+882 stub _wcsupr
+883 stub abs
+884 stub atan
+885 stub atoi
+886 stub atol
+887 stub ceil
+888 stub cos
+889 stub fabs
+890 stub floor
+891 stub isalpha
+892 stub isdigit
+893 stub islower
+894 stub isprint
+895 stub isspace
+896 stub isupper
+897 stub iswalpha
+898 stub iswctype
+899 stub isxdigit
+900 stub labs
+901 stub log
+902 stub mbstowcs
+903 stub memchr
+904 stub memcmp
+905 stub memcpy
+906 stub memmove
+907 stub memset
+908 stub pow
+909 stub qsort
+910 stub sin
+911 stub sprintf
+912 stub sqrt
+913 stub sscanf
+914 stub strcat
+915 stub strchr
+916 stub strcmp
+917 stub strcpy
+918 stub strcspn
+919 stub strlen
+920 stub strncat
+921 stub strncmp
+922 stub strncpy
+923 stub strpbrk
+924 stub strrchr
+925 stub strspn
+926 stub strstr
+927 stub swprintf
+928 stub tan
+929 stub tolower
+930 stub toupper
+931 stub towlower
+932 stub towupper
+933 stub vsprintf
+934 stub wcscat
+935 stub wcschr
+936 stub wcscmp
+937 stub wcscpy
+938 stub wcscspn
+939 stub wcslen
+940 stub wcsncat
+941 stub wcsncmp
+942 stub wcsncpy
+943 stub wcspbrk
+944 stub wcsrchr
+945 stub wcsspn
+946 stub wcsstr
+947 stub wcstok
+948 stub wcstol
+949 stub wcstombs
+950 stub wcstoul
diff --git a/if1632/relay32.c b/if1632/relay32.c
index c67ac68..3f0a24e4 100644
--- a/if1632/relay32.c
+++ b/if1632/relay32.c
@@ -52,15 +52,16 @@
 			return result;
 		case WM_NCCALCSIZE:
 			STRUCT32_NCCALCSIZE16to32Flat(lParam,&st.nccs);
-			if(((NCCALCSIZE_PARAMS*)lParam)->lppos) {
-				STRUCT32_WINDOWPOS16to32(((NCCALCSIZE_PARAMS*)lParam)->lppos,&wp);
-				st.nccs.lppos=&wp;
-			} else
-				st.nccs.lppos= 0;
+			if(wParam && ((NCCALCSIZE_PARAMS*)lParam)->lppos)
+                        {
+                            STRUCT32_WINDOWPOS16to32(PTR_SEG_TO_LIN(((NCCALCSIZE_PARAMS*)lParam)->lppos),&wp);
+                            st.nccs.lppos=&wp;
+			}
+                        else st.nccs.lppos= 0;
 			result=CallWndProc32(func,hwnd,message,wParam,(int)&st.nccs);
 			STRUCT32_NCCALCSIZE32to16Flat(&st.nccs,lParam);
-			if(((NCCALCSIZE_PARAMS*)lParam)->lppos)
-				STRUCT32_WINDOWPOS32to16(&wp,((NCCALCSIZE_PARAMS*)lParam)->lppos);
+			if(wParam && ((NCCALCSIZE_PARAMS*)lParam)->lppos)
+				STRUCT32_WINDOWPOS32to16(&wp,PTR_SEG_TO_LIN(((NCCALCSIZE_PARAMS*)lParam)->lppos));
 			return result;
 		case WM_NCCREATE:
 			lpcs = (CREATESTRUCT*)lParam;
diff --git a/if1632/shell32.spec b/if1632/shell32.spec
index e0d598f..8abcf95 100644
--- a/if1632/shell32.spec
+++ b/if1632/shell32.spec
@@ -84,7 +84,7 @@
 0079 stub SheSetCurDrive
 0080 stub SheShortenPathA
 0081 stub SheShortenPathW
-0082 stub ShellAboutA
+0082 stdcall ShellAboutA(word ptr ptr word) ShellAbout
 0083 stub ShellAboutW
 0084 stdcall ShellExecuteA(word ptr ptr ptr ptr s_word) ShellExecute
 0085 stub ShellExecuteEx
diff --git a/if1632/user.spec b/if1632/user.spec
index f5e7d91..731c0c0 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -41,7 +41,7 @@
 39  pascal16 BeginPaint(word ptr) BeginPaint
 40  pascal16 EndPaint(word ptr) EndPaint
 41  pascal16 CreateWindow(segptr segptr long s_word s_word s_word s_word
-	                  word word word segptr) CreateWindow
+	                  word word word segptr) CreateWindow16
 42  pascal16 ShowWindow(word word) ShowWindow
 43  pascal16 CloseWindow(word) CloseWindow
 44  pascal16 OpenIcon(word) OpenIcon
@@ -57,7 +57,7 @@
 54  pascal16 EnumWindows(segptr long) EnumWindows
 55  pascal16 EnumChildWindows(word segptr long) EnumChildWindows
 56  pascal16 MoveWindow(word word word word word word) MoveWindow
-57  pascal16 RegisterClass(ptr) RegisterClass
+57  pascal16 RegisterClass(ptr) RegisterClass16
 58  pascal16 GetClassName(word ptr word) GetClassName
 59  pascal16 SetActiveWindow(word) SetActiveWindow
 60  pascal16 GetActiveWindow() GetActiveWindow
@@ -356,7 +356,7 @@
 400 stub FinalUserInit
 402 pascal16 GetPriorityClipboardFormat(word ptr s_word)
              GetPriorityClipboardFormat
-403 pascal16 UnregisterClass(segptr word) UnregisterClass
+403 pascal16 UnregisterClass(segptr word) UnregisterClass16
 404 pascal16 GetClassInfo(word segptr ptr) GetClassInfo
 406 pascal16 CreateCursor(word word word word word ptr ptr) CreateCursor
 407 pascal16 CreateIcon(word word word word word ptr ptr) CreateIcon
@@ -372,13 +372,11 @@
 416 pascal16 TrackPopupMenu(word word word word word word ptr) TrackPopupMenu
 417 pascal   GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions
 418 pascal16 SetMenuItemBitmaps(word word word word word) SetMenuItemBitmaps
-420 pascal16 wsprintf() windows_wsprintf
-# windows_wsprintf() handles arguments itself, as libc can't handle an
-# 16-bit stack. DLLRelay() will pass 16-bit stack pointer as 1st arg.
+420 pascal16 wsprintf() wsprintf
 421 pascal16 wvsprintf(ptr ptr ptr) wvsprintf
 422 stub DlgDirSelectEx
 423 stub DlgDirSelectComboBoxEx
-427 stub FindWindowEx
+427 pascal16 FindWindowEx(word word segptr ptr) FindWindowEx
 428 stub TileWindows
 429 stub CascadeWindows
 430 pascal16 lstrcmp(ptr ptr) lstrcmp
@@ -400,7 +398,7 @@
 450 stub CreateIconFromResourceEx
 451 pascal16 TranslateMDISysAccel(word ptr) TranslateMDISysAccel
 452 pascal16 CreateWindowEx(long segptr segptr long s_word s_word s_word s_word
-                            word word word segptr) CreateWindowEx
+                            word word word segptr) CreateWindowEx16
 454 pascal16 AdjustWindowRectEx(ptr long word long) AdjustWindowRectEx
 455 pascal16 GetIconID(word long) GetIconID
 456 pascal16 LoadIconHandler(word word) LoadIconHandler
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 6f68215..e38df88 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -89,7 +89,7 @@
 0080 stub CreateMenu
 0081 stub CreatePopupMenu
 0082 stdcall CreateWindowExA(long ptr ptr long long long long long 
-							long long long ptr)	USER32_CreateWindowExA
+				long long long ptr) CreateWindowEx32A
 0083 stub CreateWindowExW
 0084 stub CreateWindowStationA
 0085 stub CreateWindowStationW
@@ -237,7 +237,7 @@
 0225 stub GetClipboardViewer
 0226 stub GetCursor
 0227 stub GetCursorInfo
-0228 stub GetCursorPos
+0228 stdcall GetCursorPos(ptr) GetCursorPos
 0229 stdcall GetDC(long) GetDC
 0230 stub GetDCEx
 0231 stdcall GetDesktopWindow() GetDesktopWindow
@@ -435,7 +435,7 @@
 0423 stub PtInRect
 0424 stub QuerySendMessage
 0425 stub RedrawWindow
-0426 stdcall RegisterClassA(ptr)	USER32_RegisterClassA
+0426 stdcall RegisterClassA(ptr) RegisterClass32A
 0427 stub RegisterClassExA
 0428 stub RegisterClassExW
 0429 stub RegisterClassW
diff --git a/if1632/wsock32.spec b/if1632/wsock32.spec
new file mode 100644
index 0000000..f20befb
--- /dev/null
+++ b/if1632/wsock32.spec
@@ -0,0 +1,80 @@
+name	wsock32
+type	win32
+base	0
+
+001 stub accept
+002 stub bind
+003 stub closesocket
+004 stub connect
+005 stub getpeername
+006 stub getsockname
+007 stub getsockopt
+008 stub htonl
+009 stub htons
+010 stub inet_addr
+011 stub inet_ntoa
+012 stub ioctlsocket
+013 stub listen
+014 stub ntohl
+015 stub ntohs
+016 stub recv
+017 stub recvfrom
+018 stub select
+019 stub send
+020 stub sendto
+021 stub setsockopt
+022 stub shutdown
+023 stub socket
+051 stub gethostbyaddr
+052 stub gethostbyname
+053 stub getprotobyname
+054 stub getprotobynumber
+055 stub getservbyname
+056 stub getservbyport
+057 stub gethostname
+101 stub WSAAsyncSelect
+102 stub WSAAsyncGetHostByAddr
+103 stub WSAAsyncGetHostByName
+104 stub WSAAsyncGetProtoByNumber
+105 stub WSAAsyncGetProtoByName
+106 stub WSAAsyncGetServByPort
+107 stub WSAAsyncGetServByName
+108 stub WSACancelAsyncRequest
+109 stub WSASetBlockingHook
+110 stub WSAUnhookBlockingHook
+111 stub WSAGetLastError
+112 stub WSASetLastError
+113 stub WSACancelBlockingCall
+114 stub WSAIsBlocking
+115 stub WSAStartup
+116 stub WSACleanup
+151 stub __WSAFDIsSet
+#500 stub WEP
+# applications *should* 'degrade gracefully if these are not present
+# ... as it is, they don't
+#1000 stub WSApSetPostRoutine
+#1100 stub inet_network
+#1101 stub getnetbyname
+#1102 stub rcmd
+#1103 stub rexec
+#1104 stub rresvport
+#1105 stub sethostname
+#1106 stub dn_expand
+#1107 stub WSARecvEx
+1108 stub s_perror
+1109 stub GetAddressByNameA
+1110 stub GetAddressByNameW
+#1111 stub EnumProtocolsA
+#1112 stub EnumProtocolsW
+#1113 stub GetTypeByNameA
+#1114 stub GetTypeByNameW
+#1115 stub GetNameByTypeA
+#1116 stub GetNameByTypeW
+#1117 stub SetServiceA
+#1118 stub SetServiceW
+#1119 stub GetServiceA
+#1120 stub GetServiceW
+#1130 stub NPLoadNameSpaces
+#1140 stub TransmitFile
+#1141 stub AcceptEx
+#1142 stub GetAcceptExSockaddrs
diff --git a/include/advapi32.h b/include/advapi32.h
index d4531ad..5de3830 100644
--- a/include/advapi32.h
+++ b/include/advapi32.h
@@ -3,6 +3,6 @@
 #include "shell.h"
 #include "kernel32.h"
 
-BOOL WINAPI GetUserNameA (char * lpBuffer, DWORD  *nSize);
+BOOL GetUserNameA (char * lpBuffer, DWORD  *nSize);
 
 #endif  /* __WINE_ADVAPI32_H */
diff --git a/include/caption.h b/include/caption.h
deleted file mode 100644
index 0c951c3..0000000
--- a/include/caption.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *   Caption Bar definitions
- */
-
-
-typedef struct tagHEADCAPTION {
-    HBITMAP	hClose;
-    HBITMAP	hMinim;
-    HBITMAP	hMaxim;
-    HMENU	hSysMenu;
-    RECT	rectClose;
-    RECT	rectMinim;
-    RECT	rectMaxim;
-} HEADCAPTION;
-typedef HEADCAPTION FAR* LPHEADCAPTION;
-
-
diff --git a/include/class.h b/include/class.h
index 042c746..f110089 100644
--- a/include/class.h
+++ b/include/class.h
@@ -9,18 +9,25 @@
 
 #include "windows.h"
 
-#define CLASS_MAGIC   0x4b4e      /* 'NK' */
+#define CLASS_MAGIC   ('C' | ('L' << 8) | ('A' << 16) | ('S' << 24))
 
 typedef struct tagCLASS
 {
-    struct tagCLASS *next;      /* Next class */
-    HCLASS           self;      /* Handle to this class */
-    WORD             wMagic;    /* Magic number (must be CLASS_MAGIC) */
-    ATOM             atomName;  /* Name of the class */
-    HANDLE           hdce;      /* Class DCE (if CS_CLASSDC) */
-    WORD             cWindows;  /* Count of existing windows of this class */
-    WNDCLASS         wc;        /* Class information */
-    WORD             wExtra[1]; /* Class extra bytes */
+    struct tagCLASS *next;          /* Next class */
+    UINT32           magic;         /* Magic number */
+    UINT32           cWindows;      /* Count of existing windows */
+    UINT32           style;         /* Class style */
+    WNDPROC16        lpfnWndProc;   /* 16-bit window procedure */ 
+    INT32            cbClsExtra;    /* Class extra bytes */
+    INT32            cbWndExtra;    /* Window extra bytes */
+    SEGPTR           lpszMenuName;  /* Default menu name */
+    HANDLE16         hInstance;     /* Module that created the task */
+    HICON16          hIcon;         /* Default icon */
+    HCURSOR16        hCursor;       /* Default cursor */
+    HBRUSH16         hbrBackground; /* Default background */
+    ATOM             atomName;      /* Name of the class */
+    HANDLE16         hdce;          /* Class DCE (if CS_CLASSDC) */
+    WORD             wExtra[1];     /* Class extra bytes */
 } CLASS;
 
 extern void CLASS_DumpClass( CLASS *class );
diff --git a/include/commdlg.h b/include/commdlg.h
index 384b0b4..84965e4 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -5,6 +5,12 @@
 #ifndef COMMDLG_H
 #define COMMDLG_H
 
+#include "wintypes.h"		/* needed for CHOOSEFONT structure */
+
+#ifndef WINELIB
+#pragma pack(1)
+#endif
+
 #define RT_CURSOR           MAKEINTRESOURCE(1)
 #define RT_BITMAP           MAKEINTRESOURCE(2)
 #define RT_ICON             MAKEINTRESOURCE(3)
@@ -77,10 +83,10 @@
 	HWND		hwndOwner;
 	HWND		hInstance;
 	COLORREF	rgbResult;
-	COLORREF	FAR* lpCustColors;
+	COLORREF       *lpCustColors;
 	DWORD 		Flags;
 	LPARAM		lCustData;
-	UINT		(CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);
+	UINT		(*lpfnHook)(HWND, UINT, WPARAM, LPARAM);
 	LPCSTR 		lpTemplateName;
 	} CHOOSECOLOR;
 typedef CHOOSECOLOR *LPCHOOSECOLOR;
@@ -135,22 +141,22 @@
 	HDC            	        hDC;                /* printer DC/IC or NULL    */
 	SEGPTR                  lpLogFont;          /* ptr. to a LOGFONT struct */
 	short			iPointSize;         /* 10 * size in points of selected font */
-	DWORD			Flags;              /* enum. type flags         */
+	DWORD			Flags WINE_PACKED;  /* enum. type flags         */
 	COLORREF		rgbColors;          /* returned text color      */
 	LPARAM	                lCustData;          /* data passed to hook fn.  */
 /*	UINT (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);*/
         FARPROC                 lpfnHook;
 	SEGPTR			lpTemplateName;     /* custom template name     */
 	HINSTANCE		hInstance;          /* instance handle of.EXE that   */
-										/* contains cust. dlg. template  */
-	SEGPTR			lpszStyle;          /* return the style field here   */
-										/* must be LF_FACESIZE or bigger */
-	UINT			nFontType;          /* same value reported to the    */
-										/* EnumFonts callback with the   */
-										/* extra FONTTYPE_ bits added    */
-	short			nSizeMin;           /* minimum pt size allowed & */
-	short			nSizeMax;           /* max pt size allowed if    */
-										/* CF_LIMITSIZE is used      */
+							/* contains cust. dlg. template  */
+	SEGPTR			lpszStyle WINE_PACKED;  /* return the style field here   */
+							/* must be LF_FACESIZE or bigger */
+	UINT			nFontType;          	/* same value reported to the    */
+						    	/* EnumFonts callback with the   */
+							/* extra FONTTYPE_ bits added    */
+	short			nSizeMin WINE_PACKED;   /* minimum pt size allowed & */
+	short			nSizeMax WINE_PACKED;   /* max pt size allowed if    */
+							/* CF_LIMITSIZE is used      */
 	} CHOOSEFONT;
 typedef CHOOSEFONT *LPCHOOSEFONT;
 
@@ -309,6 +315,10 @@
 LRESULT PrintSetupDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
 LRESULT FormatCharDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
 
+#ifndef WINELIB
+#pragma pack(4)
+#endif
+
 #endif 		/* #ifdef COMMDLG_H */
 
 
diff --git a/include/driver.h b/include/driver.h
index be62981..5c2a08e 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -35,18 +35,14 @@
 	DWORD   dwDCISize;
 	LPCSTR  lpszDCISectionName;
 	LPCSTR  lpszDCIAliasName;
-	} DRVCONFIGINFO;
-typedef DRVCONFIGINFO FAR* LPDRVCONFIGINFO;
+} DRVCONFIGINFO, *LPDRVCONFIGINFO;
 
 typedef struct {
 	UINT    length;
 	HDRVR   hDriver;
 	HINSTANCE hModule;
 	char    szAliasName[128];
-	} DRIVERINFOSTRUCT;
-typedef DRIVERINFOSTRUCT FAR* LPDRIVERINFOSTRUCT;
-
-typedef LONG (CALLBACK* DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM);
+} DRIVERINFOSTRUCT, *LPDRIVERINFOSTRUCT;
 
 typedef struct {
 	DRIVERINFOSTRUCT dis;
@@ -54,8 +50,7 @@
 	void		*lpPrevItem;
 	void		*lpNextItem;
 	DRIVERPROC	lpDrvProc;
-	} DRIVERITEM;
-typedef DRIVERITEM FAR* LPDRIVERITEM;
+} DRIVERITEM, *LPDRIVERITEM;
 
 LRESULT DefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, 
 						DWORD dwParam1, DWORD dwParam2);
@@ -64,7 +59,7 @@
 LRESULT SendDriverMessage(HDRVR hDriver, WORD message, LPARAM lParam1, LPARAM lParam2);
 HINSTANCE GetDriverModuleHandle(HDRVR hDriver);
 HDRVR   GetNextDriver(HDRVR, DWORD);
-BOOL    GetDriverInfo(HDRVR, DRIVERINFOSTRUCT FAR*);
+BOOL    GetDriverInfo(HDRVR, DRIVERINFOSTRUCT *);
 
 
 
diff --git a/include/except.h b/include/except.h
index c3654fb..1c2ec01 100644
--- a/include/except.h
+++ b/include/except.h
@@ -209,7 +209,7 @@
  * function pointer to a UnhandledExceptionFilter();
  */
 
-typedef long (WINAPI *__PTOP_EXCFILTER)
+typedef long (*__PTOP_EXCFILTER)
                    (PEXCEPTION_POINTERS ExceptionInfo);
 
 typedef __PTOP_EXCFILTER PTOP_LEVER_EXCEPTION_FILTER;
@@ -253,8 +253,8 @@
 
 void EXC_Init(void);
 
-BOOL WINAPI RaiseException(DWORD exccode, DWORD excflags,
-                           DWORD nargs, const LPDWORD pargs);
+BOOL RaiseException(DWORD exccode, DWORD excflags,
+                    DWORD nargs, const LPDWORD pargs);
 
 /*
  *  this undocumented function is called when an exception
@@ -270,14 +270,14 @@
  *  context.   
  */
 
-BOOL  WINAPI RtlUnwind( PEXCEPTION_FRAME pestframe,
-                        LPVOID unusedEIP,
-                        PEXCEPTION_RECORD pexcrec,
-                        DWORD contextEAX );
+BOOL RtlUnwind( PEXCEPTION_FRAME pestframe,
+                LPVOID unusedEIP,
+                PEXCEPTION_RECORD pexcrec,
+                DWORD contextEAX );
 
-DWORD WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers);
+DWORD UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers);
 
-__PTOP_EXCFILTER WINAPI SetUnhandledExceptionFilter(
+__PTOP_EXCFILTER SetUnhandledExceptionFilter(
       LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
   
 #endif  /* __WINE_EXCEPT_H */
diff --git a/include/gdi.h b/include/gdi.h
index 39a65f4..9581bb7 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -198,12 +198,7 @@
 #define DC_SAVED      2   /* It is a saved DC */
 
   /* Last 32 bytes are reserved for stock object handles */
-#ifdef WINELIB32
-/* Stupid overloading (see DefWindowProc, case WM_ERASEBKGND) */
-#define GDI_HEAP_SIZE               (COLOR_BTNHIGHLIGHT+1)
-#else
-#define GDI_HEAP_SIZE               0xffe0  
-#endif
+#define GDI_HEAP_SIZE               0xffe0
 
   /* First handle possible for stock objects (must be >= GDI_HEAP_SIZE) */
 #define FIRST_STOCK_HANDLE          GDI_HEAP_SIZE
@@ -249,15 +244,6 @@
 
   /* GDI local heap */
 
-#ifdef WINELIB
-
-#define GDI_HEAP_ALLOC(size)     LocalAlloc (LMEM_FIXED,size)
-#define GDI_HEAP_LIN_ADDR(handle)  LocalLock (handle)
-#define GDI_HEAP_SEG_ADDR(handle)  LocalLock (handle)
-#define GDI_HEAP_FREE(handle)      LocalFree (handle)
-
-#else
-
 extern WORD GDI_HeapSel;
 
 #define GDI_HEAP_ALLOC(size) \
@@ -268,10 +254,14 @@
             LOCAL_Free( GDI_HeapSel, (handle) )
 #define GDI_HEAP_LIN_ADDR(handle)  \
             ((handle) ? PTR_SEG_OFF_TO_LIN(GDI_HeapSel, (handle)) : NULL)
+
+#ifdef WINELIB
+#define GDI_HEAP_SEG_ADDR(handle) ((SEGPTR)GDI_HEAP_LIN_ADDR(handle))
+#else
 #define GDI_HEAP_SEG_ADDR(handle)  \
             ((handle) ? MAKELONG((handle), GDI_HeapSel) : 0)
 
-#endif
+#endif  /* WINELIB */
 
 extern BOOL GDI_Init(void);
 extern HANDLE GDI_AllocObject( WORD, WORD );
diff --git a/include/global.h b/include/global.h
index d1692be..42014fc 100644
--- a/include/global.h
+++ b/include/global.h
@@ -11,18 +11,18 @@
 
 typedef struct
 {
-    HGLOBAL handle;
+    HGLOBAL16 handle;
     WORD sel;
     int shmid;
 } SHMDATA;
 
-extern HGLOBAL GLOBAL_CreateBlock( WORD flags, const void *ptr, DWORD size,
-                                   HGLOBAL hOwner, BOOL isCode,
-                                   BOOL is32Bit, BOOL isReadOnly,
-				   SHMDATA *shmdata);
-extern BOOL GLOBAL_FreeBlock( HGLOBAL handle );
-extern HGLOBAL GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL hOwner,
-                             BOOL isCode, BOOL is32Bit, BOOL isReadOnly );
-extern WORD GlobalHandleToSel( HGLOBAL handle );
+extern HGLOBAL16 GLOBAL_CreateBlock( UINT16 flags, const void *ptr, DWORD size,
+                                     HGLOBAL16 hOwner, BOOL isCode,
+                                     BOOL is32Bit, BOOL isReadOnly,
+                                     SHMDATA *shmdata);
+extern BOOL GLOBAL_FreeBlock( HGLOBAL16 handle );
+extern HGLOBAL16 GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL16 hOwner,
+                               BOOL isCode, BOOL is32Bit, BOOL isReadOnly );
+extern WORD GlobalHandleToSel( HGLOBAL16 handle );
 
 #endif  /* __WINE_GLOBAL_H */
diff --git a/include/ldt.h b/include/ldt.h
index b02b2cd..0daaade 100644
--- a/include/ldt.h
+++ b/include/ldt.h
@@ -47,36 +47,25 @@
 #define __AHSHIFT  3  /* don't change! */
 #define __AHINCR   (1 << __AHSHIFT)
 
-#ifndef WINELIB
 #define SELECTOR_TO_ENTRY(sel)  (((int)(sel) & 0xffff) >> __AHSHIFT)
 #define ENTRY_TO_SELECTOR(i)    ((i) ? (((int)(i) << __AHSHIFT) | 7) : 0)
 #define IS_LDT_ENTRY_FREE(i)    (!(ldt_flags_copy[(i)] & LDT_FLAGS_ALLOCATED))
 #define IS_SELECTOR_FREE(sel)   (IS_LDT_ENTRY_FREE(SELECTOR_TO_ENTRY(sel)))
 #define GET_SEL_BASE(sel)       (ldt_copy[SELECTOR_TO_ENTRY(sel)].base)
 #define GET_SEL_LIMIT(sel)      (ldt_copy[SELECTOR_TO_ENTRY(sel)].limit)
-#else
-/* Complain if these are used in WineLib */
-#define SELECTOR_TO_ENTRY(sel)  error.error
-#define ENTRY_TO_SELECTOR(i)    error.error
-#define IS_LDT_ENTRY_FREE(i)    error.error
-#define IS_SELECTOR_FREE(sel)   error.error
-#define GET_SEL_BASE(sel)       error.error
-#define GET_SEL_LIMIT(sel)      error.error
-#endif
-
-#ifndef WINELIB
-  /* Convert a segmented ptr (16:16) to a linear (32) pointer */
-#define PTR_SEG_TO_LIN(ptr) \
-           ((void*)(GET_SEL_BASE((int)(ptr) >> 16) + ((int)(ptr) & 0xffff)))
 
 #define PTR_SEG_OFF_TO_LIN(seg,off) \
            ((void*)(GET_SEL_BASE(seg) + (unsigned int)(off)))
+
+#ifndef WINELIB
+  /* Convert a segmented ptr (16:16) to a linear (32) pointer */
+#define PTR_SEG_TO_LIN(ptr) PTR_SEG_OFF_TO_LIN(SELECTOROF(ptr),OFFSETOF(ptr))
+#define PTR_SEG_OFF_TO_SEGPTR(seg,off) ((SEGPTR)MAKELONG(off,seg))
 #else
 #define PTR_SEG_TO_LIN(ptr)	((void*)(ptr))
-#define PTR_SEG_OFF_TO_LIN(seg,off)	((void*)((char*)(seg)+(int)(off)))
+#define PTR_SEG_OFF_TO_SEGPTR(seg,off) ((SEGPTR)PTR_SEG_OFF_TO_LIN(seg,off))
 #endif
 
-
 extern unsigned char ldt_flags_copy[LDT_SIZE];
 
 #define LDT_FLAGS_TYPE      0x03  /* Mask for segment type */
diff --git a/include/listbox.h b/include/listbox.h
index 60bed75..ebd9c9e 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -32,7 +32,7 @@
         BOOL    HasStrings;
         BOOL    OwnerDrawn;
 	WORD    iNumStops;
-	LPINT   TabStops;
+	LPINT16 TabStops;
 	HANDLE  hDrawItemStruct;
         BOOL    needMeasure;
 	HANDLE	HeapSel;
diff --git a/include/local.h b/include/local.h
index bfc6f12..5561078 100644
--- a/include/local.h
+++ b/include/local.h
@@ -13,15 +13,16 @@
   /* excepted that they need DS as the first parameter. This    */
   /* allows managing several heaps from the emulation library.  */
 
-extern HLOCAL LOCAL_Alloc( HANDLE ds, WORD flags, WORD size );
-extern HLOCAL LOCAL_ReAlloc( HANDLE ds, HLOCAL handle, WORD size, WORD flags );
-extern HLOCAL LOCAL_Free( HANDLE ds, HLOCAL handle );
-extern HLOCAL LOCAL_Handle( HANDLE ds, WORD addr );
-extern WORD LOCAL_Size( HANDLE ds, HLOCAL handle );
-extern WORD LOCAL_Flags( HANDLE ds, HLOCAL handle );
-extern WORD LOCAL_HeapSize( HANDLE ds );
-extern WORD LOCAL_CountFree( WORD ds );
-extern LPSTR LOCAL_Lock( HANDLE ds, HLOCAL handle );
-extern BOOL LOCAL_Unlock( HANDLE ds, HLOCAL handle );
+extern HLOCAL16 LOCAL_Alloc( HANDLE16 ds, UINT16 flags, WORD size );
+extern HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle,
+                               WORD size, UINT16 flags );
+extern HLOCAL16 LOCAL_Free( HANDLE16 ds, HLOCAL16 handle );
+extern HLOCAL16 LOCAL_Handle( HANDLE16 ds, WORD addr );
+extern UINT16 LOCAL_Size( HANDLE16 ds, HLOCAL16 handle );
+extern UINT16 LOCAL_Flags( HANDLE16 ds, HLOCAL16 handle );
+extern UINT16 LOCAL_HeapSize( HANDLE16 ds );
+extern UINT16 LOCAL_CountFree( HANDLE16 ds );
+extern LPSTR LOCAL_Lock( HANDLE16 ds, HLOCAL16 handle );
+extern BOOL LOCAL_Unlock( HANDLE16 ds, HLOCAL16 handle );
 
 #endif  /* __WINE_LOCAL_H */
diff --git a/include/menu.h b/include/menu.h
index 32c4ff7..dabde45 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -9,12 +9,13 @@
 #define MENU_MAGIC   0x554d  /* 'MU' */
 
 extern BOOL MENU_Init(void);
+extern HMENU MENU_GetDefSysMenu(void);
 extern UINT MENU_GetMenuBarHeight( HWND hwnd, UINT menubarWidth,
-				   int orgX, int orgY );         /* menu.c */
-extern void MENU_TrackMouseMenuBar( HWND hwnd, POINT pt );       /* menu.c */
-extern void MENU_TrackKbdMenuBar( WND*, UINT wParam, INT vkey);  /* menu.c */
+				   int orgX, int orgY );
+extern void MENU_TrackMouseMenuBar( HWND hwnd, POINT pt );
+extern void MENU_TrackKbdMenuBar( WND*, UINT wParam, INT vkey);
 extern UINT MENU_DrawMenuBar( HDC hDC, LPRECT lprect,
-			      HWND hwnd, BOOL suppress_draw );   /* menu.c */
+			      HWND hwnd, BOOL suppress_draw );
 extern LRESULT PopupMenuWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam );
 
 typedef struct tagMENUITEM
diff --git a/include/mmsystem.h b/include/mmsystem.h
index 0357103..a08d12b 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -36,8 +36,7 @@
             DWORD songptrpos;   /* song pointer position */
             } midi;
         } u;
-    } MMTIME;
-typedef MMTIME FAR  *LPMMTIME;
+} MMTIME,  *LPMMTIME;
 
 #define TIME_MS         0x0001  /* time in milliseconds */
 #define TIME_SAMPLES    0x0002  /* number of wave samples */
@@ -109,9 +108,7 @@
 #define CALLBACK_TASK       0x00020000l    /* dwCallback is a HTASK */
 #define CALLBACK_FUNCTION   0x00030000l    /* dwCallback is a FARPROC */
 
-typedef void (CALLBACK DRVCALLBACK) (HDRVR h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
-
-typedef DRVCALLBACK FAR *LPDRVCALLBACK;
+typedef void (*LPDRVCALLBACK) (HDRVR h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
 
 #define MM_MICROSOFT            1       /* Microsoft Corp. */
 
@@ -151,13 +148,9 @@
 #define WAVERR_SYNC           (WAVERR_BASE + 3)    /* device is synchronous */
 #define WAVERR_LASTERROR      (WAVERR_BASE + 3)    /* last error in range */
 
-DECLARE_HANDLE(HWAVE);
-DECLARE_HANDLE(HWAVEIN);
-DECLARE_HANDLE(HWAVEOUT);
-typedef HWAVEIN FAR *LPHWAVEIN;
-typedef HWAVEOUT FAR *LPHWAVEOUT;
-typedef DRVCALLBACK WAVECALLBACK;
-typedef WAVECALLBACK FAR *LPWAVECALLBACK;
+typedef HWAVEIN *LPHWAVEIN;
+typedef HWAVEOUT *LPHWAVEOUT;
+typedef LPDRVCALLBACK LPWAVECALLBACK;
 
 #define WOM_OPEN        MM_WOM_OPEN
 #define WOM_CLOSE       MM_WOM_CLOSE
@@ -178,10 +171,9 @@
     DWORD       dwUser;                 /* for client's use */
     DWORD       dwFlags;                /* assorted flags (see defines) */
     DWORD       dwLoops;                /* loop control counter */
-    struct wavehdr_tag FAR *lpNext;     /* reserved for driver */
+    struct wavehdr_tag *lpNext;         /* reserved for driver */
     DWORD       reserved;               /* reserved for driver */
-} WAVEHDR;
-typedef WAVEHDR FAR  *LPWAVEHDR;
+} WAVEHDR, *LPWAVEHDR;
 
 #define WHDR_DONE       0x00000001  /* done bit */
 #define WHDR_PREPARED   0x00000002  /* set if this header has been prepared */
@@ -197,8 +189,7 @@
     DWORD   dwFormats;             /* formats supported */
     UINT    wChannels;             /* number of sources supported */
     DWORD   dwSupport;             /* functionality supported by driver */
-} WAVEOUTCAPS;
-typedef WAVEOUTCAPS FAR  *LPWAVEOUTCAPS;
+} WAVEOUTCAPS, *LPWAVEOUTCAPS;
 
 #define WAVECAPS_PITCH          0x0001   /* supports pitch control */
 #define WAVECAPS_PLAYBACKRATE   0x0002   /* supports playback rate control */
@@ -213,8 +204,7 @@
     char    szPname[MAXPNAMELEN];    /* product name (NULL terminated string) */
     DWORD   dwFormats;               /* formats supported */
     UINT    wChannels;               /* number of channels supported */
-} WAVEINCAPS;
-typedef WAVEINCAPS FAR  *LPWAVEINCAPS;
+} WAVEINCAPS, *LPWAVEINCAPS;
 
 #define WAVE_INVALIDFORMAT     0x00000000       /* invalid format */
 #define WAVE_FORMAT_1M08       0x00000001       /* 11.025 kHz, Mono,   8-bit  */
@@ -237,66 +227,64 @@
     DWORD   nSamplesPerSec WINE_PACKED;		/* sample rate */
     DWORD   nAvgBytesPerSec WINE_PACKED;	/* for buffer estimation */
     WORD    nBlockAlign; 					/* block size of data */
-} WAVEFORMAT;
-typedef WAVEFORMAT FAR  *LPWAVEFORMAT;
+} WAVEFORMAT, *LPWAVEFORMAT;
 
 #define WAVE_FORMAT_PCM     1
 
 typedef struct {
     WAVEFORMAT  wf;
     WORD        wBitsPerSample;
-} PCMWAVEFORMAT;
-typedef PCMWAVEFORMAT FAR  *LPPCMWAVEFORMAT;
+} PCMWAVEFORMAT, *LPPCMWAVEFORMAT;
 
 UINT waveOutGetNumDevs(void);
-UINT waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS FAR* lpCaps,
+UINT waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS * lpCaps,
     UINT uSize);
-UINT waveOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+UINT waveOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume);
 UINT waveOutSetVolume(UINT uDeviceID, DWORD dwVolume);
 UINT waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
 UINT waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT waveOutOpen(HWAVEOUT FAR* lphWaveOut, UINT uDeviceID,
+UINT waveOutOpen(HWAVEOUT * lphWaveOut, UINT uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
 UINT waveOutClose(HWAVEOUT hWaveOut);
 UINT waveOutPrepareHeader(HWAVEOUT hWaveOut,
-     WAVEHDR FAR* lpWaveOutHdr, UINT uSize);
+     WAVEHDR * lpWaveOutHdr, UINT uSize);
 UINT waveOutUnprepareHeader(HWAVEOUT hWaveOut,
-    WAVEHDR FAR* lpWaveOutHdr, UINT uSize);
-UINT waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr,
+    WAVEHDR * lpWaveOutHdr, UINT uSize);
+UINT waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR * lpWaveOutHdr,
     UINT uSize);
 UINT waveOutPause(HWAVEOUT hWaveOut);
 UINT waveOutRestart(HWAVEOUT hWaveOut);
 UINT waveOutReset(HWAVEOUT hWaveOut);
 UINT waveOutBreakLoop(HWAVEOUT hWaveOut);
-UINT waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME FAR* lpInfo,
+UINT waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME * lpInfo,
     UINT uSize);
-UINT waveOutGetPitch(HWAVEOUT hWaveOut, DWORD FAR* lpdwPitch);
+UINT waveOutGetPitch(HWAVEOUT hWaveOut, DWORD * lpdwPitch);
 UINT waveOutSetPitch(HWAVEOUT hWaveOut, DWORD dwPitch);
-UINT waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD FAR* lpdwRate);
+UINT waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD * lpdwRate);
 UINT waveOutSetPlaybackRate(HWAVEOUT hWaveOut, DWORD dwRate);
-UINT waveOutGetID(HWAVEOUT hWaveOut, UINT FAR* lpuDeviceID);
+UINT waveOutGetID(HWAVEOUT hWaveOut, UINT * lpuDeviceID);
 
 DWORD waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, DWORD dw1, DWORD dw2);
 
 UINT waveInGetNumDevs(void);
-UINT waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS FAR* lpCaps,
+UINT waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS * lpCaps,
     UINT uSize);
 UINT waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT waveInOpen(HWAVEIN FAR* lphWaveIn, UINT uDeviceID,
+UINT waveInOpen(HWAVEIN * lphWaveIn, UINT uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
 UINT waveInClose(HWAVEIN hWaveIn);
 UINT waveInPrepareHeader(HWAVEIN hWaveIn,
-    WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+    WAVEHDR * lpWaveInHdr, UINT uSize);
 UINT waveInUnprepareHeader(HWAVEIN hWaveIn,
-    WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+    WAVEHDR * lpWaveInHdr, UINT uSize);
 UINT waveInAddBuffer(HWAVEIN hWaveIn,
-    WAVEHDR FAR* lpWaveInHdr, UINT uSize);
+    WAVEHDR * lpWaveInHdr, UINT uSize);
 UINT waveInStart(HWAVEIN hWaveIn);
 UINT waveInStop(HWAVEIN hWaveIn);
 UINT waveInReset(HWAVEIN hWaveIn);
-UINT waveInGetPosition(HWAVEIN hWaveIn, MMTIME FAR* lpInfo,
+UINT waveInGetPosition(HWAVEIN hWaveIn, MMTIME * lpInfo,
     UINT uSize);
-UINT waveInGetID(HWAVEIN hWaveIn, UINT FAR* lpuDeviceID);
+UINT waveInGetID(HWAVEIN hWaveIn, UINT * lpuDeviceID);
 
 DWORD waveInMessage(HWAVEIN hWaveIn, UINT uMessage, DWORD dw1, DWORD dw2);
 
@@ -308,18 +296,14 @@
 #define MIDIERR_INVALIDSETUP  (MIDIERR_BASE + 5)   /* invalid setup */
 #define MIDIERR_LASTERROR     (MIDIERR_BASE + 5)   /* last error in range */
 
-DECLARE_HANDLE(HMIDI);
-DECLARE_HANDLE(HMIDIIN);
-DECLARE_HANDLE(HMIDIOUT);
-typedef HMIDIIN FAR *LPHMIDIIN;
-typedef HMIDIOUT FAR *LPHMIDIOUT;
-typedef DRVCALLBACK MIDICALLBACK;
-typedef MIDICALLBACK FAR *LPMIDICALLBACK;
+typedef HMIDIIN  *LPHMIDIIN;
+typedef HMIDIOUT  *LPHMIDIOUT;
+typedef LPDRVCALLBACK LPMIDICALLBACK;
 #define MIDIPATCHSIZE   128
 typedef WORD PATCHARRAY[MIDIPATCHSIZE];
-typedef WORD FAR *LPPATCHARRAY;
+typedef WORD *LPPATCHARRAY;
 typedef WORD KEYARRAY[MIDIPATCHSIZE];
-typedef WORD FAR *LPKEYARRAY;
+typedef WORD *LPKEYARRAY;
 
 #define MIM_OPEN        MM_MIM_OPEN
 #define MIM_CLOSE       MM_MIM_CLOSE
@@ -352,8 +336,7 @@
     UINT    wNotes;                /* max # of notes (internal synth only) */
     UINT    wChannelMask;          /* channels used (internal synth only) */
     DWORD   dwSupport;             /* functionality supported by driver */
-} MIDIOUTCAPS;
-typedef MIDIOUTCAPS FAR  *LPMIDIOUTCAPS;
+} MIDIOUTCAPS, *LPMIDIOUTCAPS;
 
 #define MOD_MIDIPORT    1  /* output port */
 #define MOD_SYNTH       2  /* generic internal synth */
@@ -370,8 +353,7 @@
     UINT    wPid;                  /* product ID */
     VERSION vDriverVersion;        /* version of the driver */
     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
-} MIDIINCAPS;
-typedef MIDIINCAPS FAR  *LPMIDIINCAPS;
+} MIDIINCAPS, *LPMIDIINCAPS;
 
 typedef struct {
     LPSTR       lpData;               /* pointer to locked data block */
@@ -379,10 +361,9 @@
     DWORD       dwBytesRecorded;      /* used for input only */
     DWORD       dwUser;               /* for client's use */
     DWORD       dwFlags;              /* assorted flags (see defines) */
-    struct midihdr_tag FAR *lpNext;   /* reserved for driver */
+    struct midihdr_tag *lpNext;       /* reserved for driver */
     DWORD       reserved;             /* reserved for driver */
-} MIDIHDR;
-typedef MIDIHDR FAR  *LPMIDIHDR;
+} MIDIHDR, *LPMIDIHDR;
 
 #define MHDR_DONE       0x00000001       /* done bit */
 #define MHDR_PREPARED   0x00000002       /* set if header prepared */
@@ -390,27 +371,27 @@
 
 UINT midiOutGetNumDevs(void);
 UINT midiOutGetDevCaps(UINT uDeviceID,
-    MIDIOUTCAPS FAR* lpCaps, UINT uSize);
-UINT midiOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+    MIDIOUTCAPS * lpCaps, UINT uSize);
+UINT midiOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume);
 UINT midiOutSetVolume(UINT uDeviceID, DWORD dwVolume);
 UINT midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
 UINT midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT midiOutOpen(HMIDIOUT FAR* lphMidiOut, UINT uDeviceID,
+UINT midiOutOpen(HMIDIOUT * lphMidiOut, UINT uDeviceID,
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
 UINT midiOutClose(HMIDIOUT hMidiOut);
 UINT midiOutPrepareHeader(HMIDIOUT hMidiOut,
-    MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+    MIDIHDR * lpMidiOutHdr, UINT uSize);
 UINT midiOutUnprepareHeader(HMIDIOUT hMidiOut,
-    MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+    MIDIHDR * lpMidiOutHdr, UINT uSize);
 UINT midiOutShortMsg(HMIDIOUT hMidiOut, DWORD dwMsg);
 UINT midiOutLongMsg(HMIDIOUT hMidiOut,
-    MIDIHDR FAR* lpMidiOutHdr, UINT uSize);
+    MIDIHDR * lpMidiOutHdr, UINT uSize);
 UINT midiOutReset(HMIDIOUT hMidiOut);
 UINT midiOutCachePatches(HMIDIOUT hMidiOut,
-    UINT uBank, WORD FAR* lpwPatchArray, UINT uFlags);
+    UINT uBank, WORD * lpwPatchArray, UINT uFlags);
 UINT midiOutCacheDrumPatches(HMIDIOUT hMidiOut,
-    UINT uPatch, WORD FAR* lpwKeyArray, UINT uFlags);
-UINT midiOutGetID(HMIDIOUT hMidiOut, UINT FAR* lpuDeviceID);
+    UINT uPatch, WORD * lpwKeyArray, UINT uFlags);
+UINT midiOutGetID(HMIDIOUT hMidiOut, UINT * lpuDeviceID);
 
 DWORD midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, DWORD dw1, DWORD dw2);
 
@@ -418,19 +399,19 @@
 UINT midiInGetDevCaps(UINT uDeviceID,
     LPMIDIINCAPS lpCaps, UINT uSize);
 UINT midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT midiInOpen(HMIDIIN FAR* lphMidiIn, UINT uDeviceID,
+UINT midiInOpen(HMIDIIN * lphMidiIn, UINT uDeviceID,
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
 UINT midiInClose(HMIDIIN hMidiIn);
 UINT midiInPrepareHeader(HMIDIIN hMidiIn,
-    MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+    MIDIHDR * lpMidiInHdr, UINT uSize);
 UINT midiInUnprepareHeader(HMIDIIN hMidiIn,
-    MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+    MIDIHDR * lpMidiInHdr, UINT uSize);
 UINT midiInAddBuffer(HMIDIIN hMidiIn,
-    MIDIHDR FAR* lpMidiInHdr, UINT uSize);
+    MIDIHDR * lpMidiInHdr, UINT uSize);
 UINT midiInStart(HMIDIIN hMidiIn);
 UINT midiInStop(HMIDIIN hMidiIn);
 UINT midiInReset(HMIDIIN hMidiIn);
-UINT midiInGetID(HMIDIIN hMidiIn, UINT FAR* lpuDeviceID);
+UINT midiInGetID(HMIDIIN hMidiIn, UINT * lpuDeviceID);
 
 DWORD midiInMessage(HMIDIIN hMidiIn, UINT uMessage, DWORD dw1, DWORD dw2);
 
@@ -443,8 +424,7 @@
     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
     UINT    wTechnology;           /* type of device */
     DWORD   dwSupport;             /* functionality supported by driver */
-} AUXCAPS;
-typedef AUXCAPS FAR  *LPAUXCAPS;
+} AUXCAPS, *LPAUXCAPS;
 
 #define AUXCAPS_CDAUDIO    1       /* audio from internal CD-ROM drive */
 #define AUXCAPS_AUXIN      2       /* audio from auxiliary input jacks */
@@ -453,9 +433,9 @@
 #define AUXCAPS_LRVOLUME        0x0002  /* separate left-right volume control */
 
 UINT auxGetNumDevs(void);
-UINT auxGetDevCaps(UINT uDeviceID, AUXCAPS FAR* lpCaps, UINT uSize);
+UINT auxGetDevCaps(UINT uDeviceID, AUXCAPS * lpCaps, UINT uSize);
 UINT auxSetVolume(UINT uDeviceID, DWORD dwVolume);
-UINT auxGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume);
+UINT auxGetVolume(UINT uDeviceID, DWORD * lpdwVolume);
 
 DWORD auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2);
 
@@ -463,9 +443,7 @@
 #define TIMERR_NOCANDO        (TIMERR_BASE+1)      /* request not completed */
 #define TIMERR_STRUCT         (TIMERR_BASE+33)     /* time struct size */
 
-typedef void (CALLBACK TIMECALLBACK) (UINT uTimerID, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
-
-typedef TIMECALLBACK FAR *LPTIMECALLBACK;
+typedef void (*LPTIMECALLBACK) (UINT uTimerID, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
 
 #define TIME_ONESHOT    0   /* program timer for single event */
 #define TIME_PERIODIC   1   /* program for continuous periodic event */
@@ -473,15 +451,14 @@
 typedef struct {
     UINT    wPeriodMin;     /* minimum period supported  */
     UINT    wPeriodMax;     /* maximum period supported  */
-    } TIMECAPS;
-typedef TIMECAPS FAR  *LPTIMECAPS;
+} TIMECAPS, *LPTIMECAPS;
 
-UINT timeGetSystemTime(MMTIME FAR* lpTime, UINT uSize);
+UINT timeGetSystemTime(MMTIME * lpTime, UINT uSize);
 DWORD timeGetTime(void);
 UINT timeSetEvent(UINT uDelay, UINT uResolution,
     LPTIMECALLBACK lpFunction, DWORD dwUser, UINT uFlags);
 UINT timeKillEvent(UINT uTimerID);
-UINT timeGetDevCaps(TIMECAPS FAR* lpTimeCaps, UINT uSize);
+UINT timeGetDevCaps(TIMECAPS * lpTimeCaps, UINT uSize);
 UINT timeBeginPeriod(UINT uPeriod);
 UINT timeEndPeriod(UINT uPeriod);
 
@@ -515,21 +492,19 @@
     UINT wNumButtons;           /* number of buttons */
     UINT wPeriodMin;            /* minimum message period when captured */
     UINT wPeriodMax;            /* maximum message period when captured */
-    } JOYCAPS;
-typedef JOYCAPS FAR  *LPJOYCAPS;
+} JOYCAPS, *LPJOYCAPS;
 
 typedef struct {
     UINT wXpos;                 /* x position */
     UINT wYpos;                 /* y position */
     UINT wZpos;                 /* z position */
     UINT wButtons;              /* button states */
-    } JOYINFO;
-typedef JOYINFO FAR  *LPJOYINFO;
+} JOYINFO, *LPJOYINFO;
 
-UINT joyGetDevCaps(UINT uJoyID, JOYCAPS FAR* lpCaps, UINT uSize);
+UINT joyGetDevCaps(UINT uJoyID, JOYCAPS * lpCaps, UINT uSize);
 UINT joyGetNumDevs(void);
-UINT joyGetPos(UINT uJoyID, JOYINFO FAR* lpInfo);
-UINT joyGetThreshold(UINT uJoyID, UINT FAR* lpuThreshold);
+UINT joyGetPos(UINT uJoyID, JOYINFO * lpInfo);
+UINT joyGetThreshold(UINT uJoyID, UINT * lpuThreshold);
 UINT joyReleaseCapture(UINT uJoyID);
 UINT joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod,
     BOOL bChanged);
@@ -550,10 +525,8 @@
 #define CFSEPCHAR       '+'             /* compound file name separator char. */
 
 typedef DWORD           FOURCC;         /* a four character code */
-DECLARE_HANDLE(HMMIO);                  /* a handle to an open file */
-typedef LONG (CALLBACK MMIOPROC)(LPSTR lpmmioinfo, UINT uMessage,
+typedef LONG (*LPMMIOPROC)(LPSTR lpmmioinfo, UINT uMessage,
             LPARAM lParam1, LPARAM lParam2);
-typedef MMIOPROC FAR *LPMMIOPROC;
 
 typedef struct {
         DWORD           dwFlags;        /* general status flags */
@@ -575,8 +548,7 @@
         DWORD           dwReserved1;    /* reserved for MMIO use */
         DWORD           dwReserved2;    /* reserved for MMIO use */
         HMMIO           hmmio;          /* handle to open file */
-} MMIOINFO;
-typedef MMIOINFO FAR  *LPMMIOINFO;
+} MMIOINFO, *LPMMIOINFO;
 
 typedef struct _MMCKINFO
 {
@@ -585,8 +557,7 @@
         FOURCC          fccType;        /* form type or list type */
         DWORD           dwDataOffset;   /* offset of data portion of chunk */
         DWORD           dwFlags;        /* flags used by MMIO functions */
-} MMCKINFO;
-typedef MMCKINFO FAR  *LPMMCKINFO;
+} MMCKINFO, *LPMMCKINFO;
 
 #define MMIO_RWMODE     0x00000003      /* open file for reading/writing/both */
 #define MMIO_SHAREMODE  0x00000070      /* file sharing mode number */
@@ -653,30 +624,30 @@
 FOURCC mmioStringToFOURCC(LPCSTR sz, UINT uFlags);
 LPMMIOPROC mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc,
     DWORD dwFlags);
-HMMIO mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo,
+HMMIO mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo,
     DWORD dwOpenFlags);
 
 UINT mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
-     MMIOINFO FAR* lpmmioinfo, DWORD dwRenameFlags);
+     MMIOINFO * lpmmioinfo, DWORD dwRenameFlags);
 
 UINT mmioClose(HMMIO hmmio, UINT uFlags);
 LONG mmioRead(HMMIO hmmio, HPSTR pch, LONG cch);
 LONG mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch);
 LONG mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin);
-UINT mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags);
-UINT mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags);
+UINT mmioGetInfo(HMMIO hmmio, MMIOINFO * lpmmioinfo, UINT uFlags);
+UINT mmioSetInfo(HMMIO hmmio, const MMIOINFO * lpmmioinfo, UINT uFlags);
 UINT mmioSetBuffer(HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer,
     UINT uFlags);
 UINT mmioFlush(HMMIO hmmio, UINT uFlags);
-UINT mmioAdvance(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags);
+UINT mmioAdvance(HMMIO hmmio, MMIOINFO * lpmmioinfo, UINT uFlags);
 LONG mmioSendMessage(HMMIO hmmio, UINT uMessage,
     LPARAM lParam1, LPARAM lParam2);
-UINT mmioDescend(HMMIO hmmio, MMCKINFO FAR* lpck,
-    const MMCKINFO FAR* lpckParent, UINT uFlags);
-UINT mmioAscend(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags);
-UINT mmioCreateChunk(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags);
+UINT mmioDescend(HMMIO hmmio, MMCKINFO * lpck,
+    const MMCKINFO * lpckParent, UINT uFlags);
+UINT mmioAscend(HMMIO hmmio, MMCKINFO * lpck, UINT uFlags);
+UINT mmioCreateChunk(HMMIO hmmio, MMCKINFO * lpck, UINT uFlags);
 
-typedef UINT (CALLBACK *YIELDPROC) (UINT uDeviceID, DWORD dwYieldData);
+typedef UINT (*YIELDPROC) (UINT uDeviceID, DWORD dwYieldData);
 
 DWORD mciSendCommand (UINT uDeviceID, UINT uMessage,
     DWORD dwParam1, DWORD dwParam2);
@@ -691,7 +662,7 @@
     DWORD dwYieldData);
 
 HTASK mciGetCreatorTask(UINT uDeviceID);
-YIELDPROC mciGetYieldProc (UINT uDeviceID, DWORD FAR* lpdwYieldData);
+YIELDPROC mciGetYieldProc (UINT uDeviceID, DWORD * lpdwYieldData);
 
 #define MCIERR_INVALID_DEVICE_ID        (MCIERR_BASE + 1)
 #define MCIERR_UNRECOGNIZED_KEYWORD     (MCIERR_BASE + 3)
@@ -953,8 +924,7 @@
 
 typedef struct {
 	DWORD   dwCallback;
-	} MCI_GENERIC_PARMS;
-typedef MCI_GENERIC_PARMS FAR *LPMCI_GENERIC_PARMS;
+} MCI_GENERIC_PARMS, *LPMCI_GENERIC_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
@@ -963,43 +933,37 @@
 	LPCSTR  lpstrDeviceType;
 	LPCSTR  lpstrElementName;
 	LPCSTR  lpstrAlias;
-	} MCI_OPEN_PARMS;
-typedef MCI_OPEN_PARMS FAR *LPMCI_OPEN_PARMS;
+} MCI_OPEN_PARMS, *LPMCI_OPEN_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwFrom;
 	DWORD   dwTo;
-	} MCI_PLAY_PARMS;
-typedef MCI_PLAY_PARMS FAR *LPMCI_PLAY_PARMS;
+} MCI_PLAY_PARMS, *LPMCI_PLAY_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwTo;
-	} MCI_SEEK_PARMS;
-typedef MCI_SEEK_PARMS FAR *LPMCI_SEEK_PARMS;
+} MCI_SEEK_PARMS, *LPMCI_SEEK_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwReturn;
 	DWORD   dwItem;
 	DWORD   dwTrack;
-	} MCI_STATUS_PARMS;
-typedef MCI_STATUS_PARMS FAR * LPMCI_STATUS_PARMS;
+} MCI_STATUS_PARMS, *LPMCI_STATUS_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	LPSTR   lpstrReturn;
 	DWORD   dwRetSize;
-	} MCI_INFO_PARMS;
-typedef MCI_INFO_PARMS FAR * LPMCI_INFO_PARMS;
+} MCI_INFO_PARMS, *LPMCI_INFO_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwReturn;
 	DWORD   dwItem;
-	} MCI_GETDEVCAPS_PARMS;
-typedef MCI_GETDEVCAPS_PARMS FAR * LPMCI_GETDEVCAPS_PARMS;
+} MCI_GETDEVCAPS_PARMS, *LPMCI_GETDEVCAPS_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
@@ -1008,15 +972,13 @@
 	DWORD   dwNumber;
 	UINT    wDeviceType;
 	UINT    wReserved0;
-	} MCI_SYSINFO_PARMS;
-typedef MCI_SYSINFO_PARMS FAR * LPMCI_SYSINFO_PARMS;
+} MCI_SYSINFO_PARMS, *LPMCI_SYSINFO_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwTimeFormat;
 	DWORD   dwAudio;
-	} MCI_SET_PARMS;
-typedef MCI_SET_PARMS FAR *LPMCI_SET_PARMS;
+} MCI_SET_PARMS, *LPMCI_SET_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
@@ -1024,33 +986,28 @@
 	UINT    wReserved0;
 	HWND    hwndBreak;
 	UINT    wReserved1;
-	} MCI_BREAK_PARMS;
-typedef MCI_BREAK_PARMS FAR * LPMCI_BREAK_PARMS;
+} MCI_BREAK_PARMS, *LPMCI_BREAK_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	LPCSTR  lpstrSoundName;
-	} MCI_SOUND_PARMS;
-typedef MCI_SOUND_PARMS FAR * LPMCI_SOUND_PARMS;
+} MCI_SOUND_PARMS, *LPMCI_SOUND_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	LPCSTR  lpfilename;
-	} MCI_SAVE_PARMS;
-typedef MCI_SAVE_PARMS FAR * LPMCI_SAVE_PARMS;
+} MCI_SAVE_PARMS, *LPMCI_SAVE_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	LPCSTR  lpfilename;
-	} MCI_LOAD_PARMS;
-typedef MCI_LOAD_PARMS FAR * LPMCI_LOAD_PARMS;
+} MCI_LOAD_PARMS, *LPMCI_LOAD_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwFrom;
 	DWORD   dwTo;
-	} MCI_RECORD_PARMS;
-typedef MCI_RECORD_PARMS FAR *LPMCI_RECORD_PARMS;
+} MCI_RECORD_PARMS, *LPMCI_RECORD_PARMS;
 
 #define MCI_VD_MODE_PARK                (MCI_VD_OFFSET + 1)
 
@@ -1095,20 +1052,17 @@
 	DWORD   dwFrom;
 	DWORD   dwTo;
 	DWORD   dwSpeed;
-	} MCI_VD_PLAY_PARMS;
-typedef MCI_VD_PLAY_PARMS FAR *LPMCI_VD_PLAY_PARMS;
+} MCI_VD_PLAY_PARMS, *LPMCI_VD_PLAY_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwFrames;
-	} MCI_VD_STEP_PARMS;
-typedef MCI_VD_STEP_PARMS FAR *LPMCI_VD_STEP_PARMS;
+} MCI_VD_STEP_PARMS, *LPMCI_VD_STEP_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	LPCSTR  lpstrCommand;
-	} MCI_VD_ESCAPE_PARMS;
-typedef MCI_VD_ESCAPE_PARMS FAR *LPMCI_VD_ESCAPE_PARMS;
+} MCI_VD_ESCAPE_PARMS, *LPMCI_VD_ESCAPE_PARMS;
 
 #define MCI_WAVE_OPEN_BUFFER            0x00010000L
 
@@ -1144,15 +1098,13 @@
 	LPCSTR  lpstrElementName;
 	LPCSTR  lpstrAlias;
 	DWORD   dwBufferSeconds;
-	} MCI_WAVE_OPEN_PARMS;
-typedef MCI_WAVE_OPEN_PARMS FAR *LPMCI_WAVE_OPEN_PARMS;
+} MCI_WAVE_OPEN_PARMS, *LPMCI_WAVE_OPEN_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwFrom;
 	DWORD   dwTo;
-	} MCI_WAVE_DELETE_PARMS;
-typedef MCI_WAVE_DELETE_PARMS FAR *LPMCI_WAVE_DELETE_PARMS;
+} MCI_WAVE_DELETE_PARMS, *LPMCI_WAVE_DELETE_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
@@ -1172,8 +1124,7 @@
 	UINT    wReserved4;
 	UINT    wBitsPerSample;
 	UINT    wReserved5;
-	} MCI_WAVE_SET_PARMS;
-typedef MCI_WAVE_SET_PARMS FAR * LPMCI_WAVE_SET_PARMS;
+} MCI_WAVE_SET_PARMS, * LPMCI_WAVE_SET_PARMS;
 
 #define     MCI_SEQ_DIV_PPQN            (0 + MCI_SEQ_OFFSET)
 #define     MCI_SEQ_DIV_SMPTE_24        (1 + MCI_SEQ_OFFSET)
@@ -1209,8 +1160,7 @@
 	DWORD   dwSlave;
 	DWORD   dwMaster;
 	DWORD   dwOffset;
-	} MCI_SEQ_SET_PARMS;
-typedef MCI_SEQ_SET_PARMS FAR * LPMCI_SEQ_SET_PARMS;
+} MCI_SEQ_SET_PARMS, *LPMCI_SEQ_SET_PARMS;
 
 #define MCI_ANIM_OPEN_WS                0x00010000L
 #define MCI_ANIM_OPEN_PARENT            0x00020000L
@@ -1271,22 +1221,19 @@
 	DWORD   dwStyle;
 	HWND    hWndParent;
 	UINT    wReserved1;
-	} MCI_ANIM_OPEN_PARMS;
-typedef MCI_ANIM_OPEN_PARMS FAR *LPMCI_ANIM_OPEN_PARMS;
+} MCI_ANIM_OPEN_PARMS, *LPMCI_ANIM_OPEN_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwFrom;
 	DWORD   dwTo;
 	DWORD   dwSpeed;
-	} MCI_ANIM_PLAY_PARMS;
-typedef MCI_ANIM_PLAY_PARMS FAR *LPMCI_ANIM_PLAY_PARMS;
+} MCI_ANIM_PLAY_PARMS, *LPMCI_ANIM_PLAY_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwFrames;
-	} MCI_ANIM_STEP_PARMS;
-typedef MCI_ANIM_STEP_PARMS FAR *LPMCI_ANIM_STEP_PARMS;
+} MCI_ANIM_STEP_PARMS, *LPMCI_ANIM_STEP_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
@@ -1295,8 +1242,7 @@
 	UINT    nCmdShow;
 	UINT    wReserved2;
 	LPCSTR  lpstrText;
-	} MCI_ANIM_WINDOW_PARMS;
-typedef MCI_ANIM_WINDOW_PARMS FAR * LPMCI_ANIM_WINDOW_PARMS;
+} MCI_ANIM_WINDOW_PARMS, *LPMCI_ANIM_WINDOW_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
@@ -1306,15 +1252,13 @@
 #else   /* ifdef MCI_USE_OFFEXT */
 	RECT    rc;
 #endif  /* ifdef MCI_USE_OFFEXT */
-	} MCI_ANIM_RECT_PARMS;
-typedef MCI_ANIM_RECT_PARMS FAR * LPMCI_ANIM_RECT_PARMS;
+} MCI_ANIM_RECT_PARMS, *LPMCI_ANIM_RECT_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	RECT    rc;
 	HDC     hDC;
-	} MCI_ANIM_UPDATE_PARMS;
-typedef MCI_ANIM_UPDATE_PARMS FAR * LPMCI_ANIM_UPDATE_PARMS;
+} MCI_ANIM_UPDATE_PARMS, *LPMCI_ANIM_UPDATE_PARMS;
 
 #define MCI_OVLY_OPEN_WS                0x00010000L
 #define MCI_OVLY_OPEN_PARENT            0x00020000L
@@ -1357,8 +1301,7 @@
 	DWORD   dwStyle;
 	HWND    hWndParent;
 	UINT    wReserved1;
-	} MCI_OVLY_OPEN_PARMS;
-typedef MCI_OVLY_OPEN_PARMS FAR *LPMCI_OVLY_OPEN_PARMS;
+} MCI_OVLY_OPEN_PARMS, *LPMCI_OVLY_OPEN_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
@@ -1367,8 +1310,7 @@
 	UINT    nCmdShow;
 	UINT    wReserved2;
 	LPCSTR  lpstrText;
-	} MCI_OVLY_WINDOW_PARMS;
-typedef MCI_OVLY_WINDOW_PARMS FAR * LPMCI_OVLY_WINDOW_PARMS;
+} MCI_OVLY_WINDOW_PARMS, *LPMCI_OVLY_WINDOW_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
@@ -1378,22 +1320,19 @@
 #else   /* ifdef MCI_USE_OFFEXT */
 	RECT    rc;
 #endif  /* ifdef MCI_USE_OFFEXT */
-	} MCI_OVLY_RECT_PARMS;
-typedef MCI_OVLY_RECT_PARMS FAR * LPMCI_OVLY_RECT_PARMS;
+} MCI_OVLY_RECT_PARMS, *LPMCI_OVLY_RECT_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	LPCSTR  lpfilename;
 	RECT    rc;
-	} MCI_OVLY_SAVE_PARMS;
-typedef MCI_OVLY_SAVE_PARMS FAR * LPMCI_OVLY_SAVE_PARMS;
+} MCI_OVLY_SAVE_PARMS, *LPMCI_OVLY_SAVE_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	LPCSTR  lpfilename;
 	RECT    rc;
-	} MCI_OVLY_LOAD_PARMS;
-typedef MCI_OVLY_LOAD_PARMS FAR * LPMCI_OVLY_LOAD_PARMS;
+} MCI_OVLY_LOAD_PARMS, *LPMCI_OVLY_LOAD_PARMS;
 
 
 /**************************************************************
@@ -1525,23 +1464,20 @@
 	DWORD   	dwInstance;
 	HMIDIOUT	hMidi;
 	DWORD   	dwFlags;
-	}	PORTALLOC;
-typedef PORTALLOC FAR *LPPORTALLOC;
+} PORTALLOC, *LPPORTALLOC;
 
 typedef struct {
 	HWAVE			hWave;
 	LPWAVEFORMAT	lpFormat;
 	DWORD			dwCallBack;
 	DWORD			dwInstance;
-	} WAVEOPENDESC;
-typedef WAVEOPENDESC FAR *LPWAVEOPENDESC;
+} WAVEOPENDESC, *LPWAVEOPENDESC;
 
 typedef struct {
 	HMIDI			hMidi;
 	DWORD			dwCallback;
 	DWORD			dwInstance;
-	} MIDIOPENDESC;
-typedef MIDIOPENDESC FAR *LPMIDIOPENDESC;
+} MIDIOPENDESC, *LPMIDIOPENDESC;
 
 typedef struct {
 	UINT			wDelay;
@@ -1549,8 +1485,7 @@
 	LPTIMECALLBACK	lpFunction;
 	DWORD			dwUser;
 	UINT			wFlags;
-	} TIMEREVENT;
-typedef TIMEREVENT FAR *LPTIMEREVENT;
+} TIMEREVENT, *LPTIMEREVENT;
 
 typedef struct {
 	UINT    wDeviceID;				/* device ID */
@@ -1559,8 +1494,7 @@
 									/* filled in by the driver */
 	UINT    wType;					/* driver type */
 									/* filled in by the driver */
-	} MCI_OPEN_DRIVER_PARMS;
-typedef MCI_OPEN_DRIVER_PARMS FAR * LPMCI_OPEN_DRIVER_PARMS;
+} MCI_OPEN_DRIVER_PARMS, * LPMCI_OPEN_DRIVER_PARMS;
 
 DWORD mciGetDriverData(UINT uDeviceID);
 BOOL  mciSetDriverData(UINT uDeviceID, DWORD dwData);
diff --git a/include/nonclient.h b/include/nonclient.h
index c890201..49fa206 100644
--- a/include/nonclient.h
+++ b/include/nonclient.h
@@ -7,7 +7,7 @@
 #ifndef __WINE_NONCLIENT_H
 #define __WINE_NONCLIENT_H
 
-#include "windows.h"
+#include "win.h"
 
 extern void NC_GetInsideRect( HWND hwnd, RECT *rect );
 extern void NC_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
@@ -18,7 +18,7 @@
 extern LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params );
 extern LONG NC_HandleNCHitTest( HWND hwnd, POINT pt );
 extern LONG NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam );
-extern LONG NC_HandleNCLButtonDblClk( HWND hwnd, WPARAM wParam, LPARAM lParam );
+extern LONG NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM wParam, LPARAM lParam);
 extern LONG NC_HandleSysCommand( HWND hwnd, WPARAM wParam, POINT pt );
 extern LONG NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam );
 
diff --git a/include/ole.h b/include/ole.h
index 18cf706..b920640 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -145,8 +145,8 @@
 } OLETARGETDEVICE;
 typedef struct _OLESTREAM* LPOLESTREAM;
 typedef struct _OLESTREAMVTBL {
-	DWORD	(CALLBACK* Get)(LPOLESTREAM,LPSTR,DWORD);
-	DWORD	(CALLBACK* Put)(LPOLESTREAM,LPSTR,DWORD);
+	DWORD	(*Get)(LPOLESTREAM,LPSTR,DWORD);
+	DWORD	(*Put)(LPOLESTREAM,LPSTR,DWORD);
 } OLESTREAMVTBL;
 typedef OLESTREAMVTBL*	LPOLESTREAMVTBL;
 typedef struct _OLESTREAM {
@@ -156,14 +156,14 @@
 typedef struct _OLEOBJECT*	LPOLEOBJECT;
 typedef struct _OLECLIENT*	LPOLECLIENT;
 typedef struct _OLESERVERDOCVTBL {
-	OLESTATUS	(CALLBACK* Save)(LPOLESERVERDOC);
-	OLESTATUS	(CALLBACK* Close)(LPOLESERVERDOC);
-	OLESTATUS	(CALLBACK* SetHostNames)(LPOLESERVERDOC,OLE_LPCSTR,OLE_LPCSTR);
-	OLESTATUS	(CALLBACK* SetDocDimensions)(LPOLESERVERDOC,LPRECT);
-	OLESTATUS	(CALLBACK* GetObject)(LPOLESERVERDOC,OLE_LPCSTR,LPOLEOBJECT*,LPOLECLIENT);
-	OLESTATUS	(CALLBACK* Release)(LPOLESERVERDOC);
-	OLESTATUS	(CALLBACK* SetColorScheme)(LPOLESERVERDOC,LPLOGPALETTE);
-	OLESTATUS	(CALLBACK* Execute)(LPOLESERVERDOC,HGLOBAL);
+	OLESTATUS	(*Save)(LPOLESERVERDOC);
+	OLESTATUS	(*Close)(LPOLESERVERDOC);
+	OLESTATUS	(*SetHostNames)(LPOLESERVERDOC,OLE_LPCSTR,OLE_LPCSTR);
+	OLESTATUS	(*SetDocDimensions)(LPOLESERVERDOC,LPRECT);
+	OLESTATUS	(*GetObject)(LPOLESERVERDOC,OLE_LPCSTR,LPOLEOBJECT*,LPOLECLIENT);
+	OLESTATUS	(*Release)(LPOLESERVERDOC);
+	OLESTATUS	(*SetColorScheme)(LPOLESERVERDOC,LPLOGPALETTE);
+	OLESTATUS	(*Execute)(LPOLESERVERDOC,HGLOBAL);
 } OLESERVERDOCVTBL;
 typedef OLESERVERDOCVTBL*	LPOLESERVERDOCVTBL;
 typedef struct _OLESERVERDOC {
@@ -173,13 +173,13 @@
 
 typedef struct _OLESERVER*	LPOLESERVER;
 typedef struct _OLESERVERVTBL {
-	OLESTATUS	(CALLBACK* Open)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,LPOLESERVERDOC *);
-	OLESTATUS	(CALLBACK* Create)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC FAR*);
-	OLESTATUS	(CALLBACK* CreateFromTemplate)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC *);
-	OLESTATUS	(CALLBACK* Edit)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC *);
-	OLESTATUS	(CALLBACK* Exit)(LPOLESERVER);
-	OLESTATUS	(CALLBACK* Release)(LPOLESERVER); 
-	OLESTATUS	(CALLBACK* Execute)(LPOLESERVER); 
+	OLESTATUS	(*Open)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,LPOLESERVERDOC *);
+	OLESTATUS	(*Create)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC*);
+	OLESTATUS	(*CreateFromTemplate)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC *);
+	OLESTATUS	(*Edit)(LPOLESERVER,LHSERVERDOC,OLE_LPCSTR,OLE_LPCSTR,LPOLESERVERDOC *);
+	OLESTATUS	(*Exit)(LPOLESERVER);
+	OLESTATUS	(*Release)(LPOLESERVER); 
+	OLESTATUS	(*Execute)(LPOLESERVER); 
 } OLESERVERVTBL; 
 typedef OLESERVERVTBL	*LPOLESERVERVTBL;
 typedef struct _OLESERVER {
@@ -187,7 +187,7 @@
 	/* server specific data */
 } OLESERVER;
 typedef struct _OLECLIENTVTBL {
-	int (CALLBACK* CallBack)(LPOLECLIENT,OLE_NOTIFICATION,LPOLEOBJECT);
+	int (*CallBack)(LPOLECLIENT,OLE_NOTIFICATION,LPOLEOBJECT);
 } OLECLIENTVTBL;
 typedef OLECLIENTVTBL	*LPOLECLIENTVTBL;
 
@@ -197,44 +197,44 @@
 } OLECLIENT;
 
 typedef struct _OLEOBJECTVTBL {
-	void *	(CALLBACK* QueryProtocol)(LPOLEOBJECT,OLE_LPCSTR);
-	OLESTATUS	(CALLBACK* Release)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* Show)(LPOLEOBJECT,BOOL);
-	OLESTATUS	(CALLBACK* DoVerb)(LPOLEOBJECT,UINT,BOOL,BOOL);
-	OLESTATUS	(CALLBACK* GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE *);
-	OLESTATUS	(CALLBACK* SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE);
-	OLESTATUS	(CALLBACK* SetTargetDevice)(LPOLEOBJECT,HGLOBAL);
-	OLESTATUS	(CALLBACK* SetBounds)(LPOLEOBJECT,LPRECT);
-	OLESTATUS	(CALLBACK* EnumFormats)(LPOLEOBJECT,OLECLIPFORMAT);
-	OLESTATUS	(CALLBACK* SetColorScheme)(LPOLEOBJECT,LPLOGPALETTE);
-	OLESTATUS	(CALLBACK* Delete)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* SetHostNames)(LPOLEOBJECT,OLE_LPCSTR,OLE_LPCSTR);
-	OLESTATUS	(CALLBACK* SaveToStream)(LPOLEOBJECT,LPOLESTREAM);
-	OLESTATUS	(CALLBACK* Clone)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT *);
-	OLESTATUS	(CALLBACK* CopyFromLink)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT *);
-	OLESTATUS	(CALLBACK* Equal)(LPOLEOBJECT,LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* CopyToClipBoard)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* Draw)(LPOLEOBJECT,HDC,LPRECT,LPRECT,HDC);
-	OLESTATUS	(CALLBACK* Activate)(LPOLEOBJECT,UINT,BOOL,BOOL,HWND,LPRECT);
-	OLESTATUS	(CALLBACK* Execute)(LPOLEOBJECT,HGLOBAL,UINT);
-	OLESTATUS	(CALLBACK* Close)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* Update)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* Reconnect)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* ObjectConvert)(LPOLEOBJECT,OLE_LPCSTR,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*);
-	OLESTATUS	(CALLBACK* GetLinkUpdateOptions)(LPOLEOBJECT,LPOLEOPT_UPDATE);
-	OLESTATUS	(CALLBACK* SetLinkUpdateOptions)(LPOLEOBJECT,OLEOPT_UPDATE);
-	OLESTATUS	(CALLBACK* Rename)(LPOLEOBJECT,OLE_LPCSTR);
-	OLESTATUS	(CALLBACK* QueryName)(LPOLEOBJECT,LPSTR,LPUINT);
-	OLESTATUS	(CALLBACK* QueryType)(LPOLEOBJECT,LPLONG);
-	OLESTATUS	(CALLBACK* QueryBounds)(LPOLEOBJECT,LPRECT);
-	OLESTATUS	(CALLBACK* QuerySize)(LPOLEOBJECT,LPDWORD);
-	OLESTATUS	(CALLBACK* QueryOpen)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* QueryOutOfDate)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* QueryReleaseStatus)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* QueryReleaseError)(LPOLEOBJECT);
-	OLE_RELEASE_METHOD	(CALLBACK* QueryReleaseMethod)(LPOLEOBJECT);
-	OLESTATUS	(CALLBACK* RequestData)(LPOLEOBJECT,OLECLIPFORMAT);
-	OLESTATUS	(CALLBACK* ObjectLong)(LPOLEOBJECT,UINT,LPLONG);
+        void *  	(*QueryProtocol)(LPOLEOBJECT,OLE_LPCSTR);
+	OLESTATUS	(*Release)(LPOLEOBJECT);
+	OLESTATUS	(*Show)(LPOLEOBJECT,BOOL);
+	OLESTATUS	(*DoVerb)(LPOLEOBJECT,UINT,BOOL,BOOL);
+	OLESTATUS	(*GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE *);
+	OLESTATUS	(*SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE);
+	OLESTATUS	(*SetTargetDevice)(LPOLEOBJECT,HGLOBAL);
+	OLESTATUS	(*SetBounds)(LPOLEOBJECT,LPRECT);
+	OLESTATUS	(*EnumFormats)(LPOLEOBJECT,OLECLIPFORMAT);
+	OLESTATUS	(*SetColorScheme)(LPOLEOBJECT,LPLOGPALETTE);
+	OLESTATUS	(*Delete)(LPOLEOBJECT);
+	OLESTATUS	(*SetHostNames)(LPOLEOBJECT,OLE_LPCSTR,OLE_LPCSTR);
+	OLESTATUS	(*SaveToStream)(LPOLEOBJECT,LPOLESTREAM);
+	OLESTATUS	(*Clone)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT *);
+	OLESTATUS	(*CopyFromLink)(LPOLEOBJECT,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT *);
+	OLESTATUS	(*Equal)(LPOLEOBJECT,LPOLEOBJECT);
+	OLESTATUS	(*CopyToClipBoard)(LPOLEOBJECT);
+	OLESTATUS	(*Draw)(LPOLEOBJECT,HDC,LPRECT,LPRECT,HDC);
+	OLESTATUS	(*Activate)(LPOLEOBJECT,UINT,BOOL,BOOL,HWND,LPRECT);
+	OLESTATUS	(*Execute)(LPOLEOBJECT,HGLOBAL,UINT);
+	OLESTATUS	(*Close)(LPOLEOBJECT);
+	OLESTATUS	(*Update)(LPOLEOBJECT);
+	OLESTATUS	(*Reconnect)(LPOLEOBJECT);
+	OLESTATUS	(*ObjectConvert)(LPOLEOBJECT,OLE_LPCSTR,LPOLECLIENT,LHCLIENTDOC,OLE_LPCSTR,LPOLEOBJECT*);
+	OLESTATUS	(*GetLinkUpdateOptions)(LPOLEOBJECT,LPOLEOPT_UPDATE);
+	OLESTATUS	(*SetLinkUpdateOptions)(LPOLEOBJECT,OLEOPT_UPDATE);
+	OLESTATUS	(*Rename)(LPOLEOBJECT,OLE_LPCSTR);
+	OLESTATUS	(*QueryName)(LPOLEOBJECT,LPSTR,LPUINT16);
+	OLESTATUS	(*QueryType)(LPOLEOBJECT,LPLONG);
+	OLESTATUS	(*QueryBounds)(LPOLEOBJECT,LPRECT);
+	OLESTATUS	(*QuerySize)(LPOLEOBJECT,LPDWORD);
+	OLESTATUS	(*QueryOpen)(LPOLEOBJECT);
+	OLESTATUS	(*QueryOutOfDate)(LPOLEOBJECT);
+	OLESTATUS	(*QueryReleaseStatus)(LPOLEOBJECT);
+	OLESTATUS	(*QueryReleaseError)(LPOLEOBJECT);
+	OLE_RELEASE_METHOD (*QueryReleaseMethod)(LPOLEOBJECT);
+	OLESTATUS	(*RequestData)(LPOLEOBJECT,OLECLIPFORMAT);
+	OLESTATUS	(*ObjectLong)(LPOLEOBJECT,UINT,LPLONG);
 } OLEOBJECTVTBL;
 typedef OLEOBJECTVTBL*	LPOLEOBJECTVTBL;
 
@@ -243,11 +243,11 @@
 } OLEOBJECT;
 
 
-OLESTATUS WINAPI OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER *,HINSTANCE,OLE_SERVER_USE);
-OLESTATUS WINAPI OleUnblockServer(LHSERVER,BOOL *);
-OLESTATUS WINAPI OleRegisterServerDoc(LHSERVER,LPCSTR,LPOLESERVERDOC,LHSERVERDOC *);
-OLESTATUS WINAPI OleRegisterClientDoc(LPCSTR,LPCSTR,LONG,LHCLIENTDOC *);
-OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC,LPCSTR);
-OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC);
-OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC);
-OLESTATUS WINAPI OleRevokeServer(LHSERVER);
+OLESTATUS OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER *,HINSTANCE,OLE_SERVER_USE);
+OLESTATUS OleUnblockServer(LHSERVER,BOOL *);
+OLESTATUS OleRegisterServerDoc(LHSERVER,LPCSTR,LPOLESERVERDOC,LHSERVERDOC *);
+OLESTATUS OleRegisterClientDoc(LPCSTR,LPCSTR,LONG,LHCLIENTDOC *);
+OLESTATUS OleRenameClientDoc(LHCLIENTDOC,LPCSTR);
+OLESTATUS OleRevokeServerDoc(LHSERVERDOC);
+OLESTATUS OleRevokeClientDoc(LHCLIENTDOC);
+OLESTATUS OleRevokeServer(LHSERVER);
diff --git a/include/stackframe.h b/include/stackframe.h
index d0c8400..e52eb14 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -75,9 +75,9 @@
 #endif
 SEGPTR MAKE_SEGPTR(void *ptr);
 #else
-#define CURRENT_STACK16	error.error
-#define CURRENT_DS		0
-#define MAKE_SEGPTR(ptr)	((SEGPTR)ptr)
+#define CURRENT_STACK16	   error.error
+#define CURRENT_DS         ((WORD)GetTaskDS())
+#define MAKE_SEGPTR(ptr)   ((SEGPTR)ptr)
 #endif
 
 #endif /* WINE_STACKFRAME_H */
diff --git a/include/struct32.h b/include/struct32.h
index ff53d24..ea5b75b 100644
--- a/include/struct32.h
+++ b/include/struct32.h
@@ -66,8 +66,6 @@
 	WORD id WINE_PACKED;
 } DLGITEMTEMPLATE32;
 
-#define CW_USEDEFAULT32	0x80000000
-
 typedef struct tagMSG32
 {
 	DWORD hwnd;
diff --git a/include/task.h b/include/task.h
index 82bc80e..ce56b76 100644
--- a/include/task.h
+++ b/include/task.h
@@ -89,7 +89,7 @@
     DWORD   compat_flags WINE_PACKED;   /* Compatibility flags */
     BYTE    unused4[14];
     HANDLE  hPDB;                       /* Selector of PDB (i.e. PSP) */
-    DWORD   dta WINE_PACKED;            /* Current DTA */
+    SEGPTR  dta WINE_PACKED;            /* Current DTA */
     BYTE    curdrive;                   /* Current drive */
     BYTE    curdir[65];                 /* Current directory */
     WORD    nCmdShow;                   /* cmdShow parameter to WinMain */
diff --git a/include/toolhelp.h b/include/toolhelp.h
index 11e0e54..e161101 100644
--- a/include/toolhelp.h
+++ b/include/toolhelp.h
@@ -77,9 +77,8 @@
 BOOL GlobalInfo( GLOBALINFO *pInfo );
 BOOL GlobalFirst( GLOBALENTRY *pGlobal, WORD wFlags );
 BOOL GlobalNext( GLOBALENTRY *pGlobal, WORD wFlags) ;
-BOOL GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL hItem );
-BOOL GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE hModule, WORD wSeg );
-WORD GlobalHandleToSel( HGLOBAL handle );
+BOOL GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem );
+BOOL GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg );
 
 /* Local heap */
 
@@ -92,7 +91,7 @@
 typedef struct
 {
     DWORD   dwSize;
-    HLOCAL  hHandle;
+    HLOCAL16  hHandle;
     WORD    wAddress;
     WORD    wSize;
     WORD    wFlags;
@@ -333,7 +332,7 @@
 struct {
 	DWORD	dwSize;
 	UINT	wErrCode;
-	VOID	FAR*	lpInfo;	/* depends on wErrCode */
+	VOID   *lpInfo; /* depends on wErrCode */
 } NFYLOGERROR;
 
 /* called for parameter errors? */
@@ -342,6 +341,6 @@
 	DWORD	dwSize;
 	UINT	wErrCode;
 	FARPROC	lpfnErrorAddr;
-	void FAR* FAR* lpBadParam;
+	void  **lpBadParam;
 } NFYLOGPARAMERROR;
 #endif /* __TOOLHELP_H */
diff --git a/include/user.h b/include/user.h
index c17364e..e4eead7 100644
--- a/include/user.h
+++ b/include/user.h
@@ -10,16 +10,6 @@
 #include "ldt.h"
 #include "local.h"
 
-#ifdef WINELIB
-
-#define USER_HEAP_ALLOC(size) LocalAlloc (LMEM_FIXED, size)
-#define USER_HEAP_REALLOC(handle,size) LocalReAlloc (handle,size,LMEM_FIXED)
-#define USER_HEAP_LIN_ADDR(handle) LocalLock (handle)
-#define USER_HEAP_SEG_ADDR(handle) LocalLock (handle)
-#define USER_HEAP_FREE(handle) LocalFree (handle)
-
-#else  /* WINELIB */
-
 extern WORD USER_HeapSel;
 
 #define USER_HEAP_ALLOC(size) \
@@ -30,9 +20,12 @@
             LOCAL_Free( USER_HeapSel, (handle) )
 #define USER_HEAP_LIN_ADDR(handle)  \
             ((handle) ? PTR_SEG_OFF_TO_LIN(USER_HeapSel, (handle)) : NULL)
+
+#ifdef WINELIB
+#define USER_HEAP_SEG_ADDR(handle)  ((SEGPTR)(USER_HEAP_LIN_ADDR(handle)))
+#else
 #define USER_HEAP_SEG_ADDR(handle)  \
             ((handle) ? MAKELONG((handle), USER_HeapSel) : 0)
-
 #endif  /* WINELIB */
 
 #endif  /* USER_H */
diff --git a/include/ver.h b/include/ver.h
index e6bcd8e..2324603 100644
--- a/include/ver.h
+++ b/include/ver.h
@@ -127,36 +127,36 @@
 	DWORD   dwFileDateLS;
 } VS_FIXEDFILEINFO;
 
-DWORD WINAPI
+DWORD
 GetFileResourceSize(LPCSTR filename,SEGPTR restype,SEGPTR resid,LPDWORD off);
 
-DWORD WINAPI
+DWORD
 GetFileResource(LPCSTR filename,SEGPTR restype,SEGPTR resid,
 		DWORD off,DWORD reslen,LPVOID data
 );
 
-DWORD WINAPI
+DWORD
 GetFileVersionInfoSize(LPCSTR filename,LPDWORD handle);
 
-DWORD WINAPI
+DWORD
 GetFileVersionInfo(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data);
 
-DWORD WINAPI
+DWORD
 VerFindFile(
 	UINT flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
 	LPSTR curdir,UINT *curdirlen,LPSTR destdir,UINT*destdirlen
 );
 
-DWORD WINAPI
+DWORD
 VerInstallFile(
 	UINT flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
 	LPCSTR destdir,LPSTR tmpfile,UINT*tmpfilelen
 );
 
-DWORD WINAPI
+DWORD
 VerLanguageName(UINT lang,LPSTR langname,UINT langnamelen);
 
-DWORD WINAPI
+DWORD
 VerQueryValue(SEGPTR block,LPCSTR subblock,SEGPTR *buffer,UINT *buflen);
 
 /*
diff --git a/include/winbase.h b/include/winbase.h
index e913407..0eb05f5 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -43,7 +43,7 @@
 
 typedef LONG (TOP_LEVEL_EXCEPTION_FILTER)(struct _EXCEPTION_POINTERS *);
 
-WINAPI  TOP_LEVEL_EXCEPTION_FILTER *SetUnhandledExceptionFilter(TOP_LEVEL_EXCEPTION_FILTER *func);
+TOP_LEVEL_EXCEPTION_FILTER *SetUnhandledExceptionFilter(TOP_LEVEL_EXCEPTION_FILTER *func);
 
 /*WINAPI int  SetErrorMode(int);*/
 
@@ -114,39 +114,36 @@
 
 /*DWORD WINAPI GetVersion( void );*/
 
-int
-WINAPI WinMain(HINSTANCE, HINSTANCE prev, char *cmd, int show);
+int WinMain(HINSTANCE, HINSTANCE prev, char *cmd, int show);
 
 #define GMEM_FIXED          0x0000
 #define GMEM_MOVEABLE 	    0x0002
 
-DECLARE_HANDLE(HACCEL);
-
-HACCEL WINAPI LoadAcceleratorsA(   HINSTANCE, const char *);
+HACCEL LoadAcceleratorsA(   HINSTANCE, const char *);
 #define FreeModule(hLibModule) FreeLibrary((hLibModule))
 #define MakeProcInstance(lpProc,hInstance) (lpProc)
 #define FreeProcInstance(lpProc) (lpProc)
 
 
-WINAPI void     DeleteCriticalSection(CRITICAL_SECTION *lpCrit);
-WINAPI void     EnterCriticalSection(CRITICAL_SECTION *lpCrit);
-WINAPI int      GetCurrentProcessId(void);
-WINAPI HANDLE32 GetProcessHeap(void);
-WINAPI LPVOID   HeapAlloc(HANDLE32,DWORD,DWORD);
-WINAPI DWORD    HeapCompact(HANDLE32,DWORD);
-WINAPI HANDLE32 HeapCreate(DWORD,DWORD,DWORD);
-WINAPI BOOL     HeapDestroy(HANDLE32);
-WINAPI BOOL     HeapFree(HANDLE32,DWORD,LPVOID);
-WINAPI BOOL     HeapLock(HANDLE32);
-WINAPI LPVOID   HeapReAlloc(HANDLE32,DWORD,LPVOID,DWORD);
-WINAPI DWORD    HeapSize(HANDLE32,DWORD,LPVOID);
-WINAPI BOOL     HeapUnlock(HANDLE32);
-WINAPI BOOL     HeapValidate(HANDLE32,DWORD,LPVOID);
-WINAPI void     InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
-WINAPI void     LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
-WINAPI HANDLE   OpenProcess(DWORD access, BOOL inherit, DWORD id);
-WINAPI int      TerminateProcess(HANDLE h, int ret);
-WINAPI LPVOID   VirtualAlloc(LPVOID addr,DWORD size,DWORD type,DWORD protect);
-WINAPI BOOL     VirtualFree( LPVOID addr, DWORD size, DWORD type );
+void     DeleteCriticalSection(CRITICAL_SECTION *lpCrit);
+void     EnterCriticalSection(CRITICAL_SECTION *lpCrit);
+int      GetCurrentProcessId(void);
+HANDLE32 GetProcessHeap(void);
+LPVOID   HeapAlloc(HANDLE32,DWORD,DWORD);
+DWORD    HeapCompact(HANDLE32,DWORD);
+HANDLE32 HeapCreate(DWORD,DWORD,DWORD);
+BOOL     HeapDestroy(HANDLE32);
+BOOL     HeapFree(HANDLE32,DWORD,LPVOID);
+BOOL     HeapLock(HANDLE32);
+LPVOID   HeapReAlloc(HANDLE32,DWORD,LPVOID,DWORD);
+DWORD    HeapSize(HANDLE32,DWORD,LPVOID);
+BOOL     HeapUnlock(HANDLE32);
+BOOL     HeapValidate(HANDLE32,DWORD,LPVOID);
+void     InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
+void     LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
+HANDLE   OpenProcess(DWORD access, BOOL inherit, DWORD id);
+int      TerminateProcess(HANDLE h, int ret);
+LPVOID   VirtualAlloc(LPVOID addr,DWORD size,DWORD type,DWORD protect);
+BOOL     VirtualFree( LPVOID addr, DWORD size, DWORD type );
 
 #endif  /* __WINE_WINBASE_H */
diff --git a/include/wincon.h b/include/wincon.h
index c10560c..bb5ffd0 100644
--- a/include/wincon.h
+++ b/include/wincon.h
@@ -196,140 +196,62 @@
 #define ENABLE_WRAP_AT_EOL_OUTPUT 0x02
 
 
-BOOL WINAPI AllocConsole (VOID);
+BOOL AllocConsole (VOID);
 
 
-HANDLE WINAPI CreateConsoleScreenBuffer (DWORD access,
-					 DWORD mode,
-					 CONST SECURITY_ATTRIBUTES * lattr,
-					 DWORD flags,
-					 VOID * ptr);
-
-BOOL WINAPI FillConsoleOutputAttribute (HANDLE h,
-					WORD attr,
-					DWORD len,
-					COORD co,
-					DWORD * done);
-
-BOOL WINAPI FillConsoleOutputCharacterA (HANDLE h,
-					 CHAR c,
-					 DWORD len,
-					 COORD co,
-					 DWORD * done);
-
-
-BOOL WINAPI FlushBuffer (HANDLE h);
-
-BOOL WINAPI FreeConsole (VOID);
-BOOL WINAPI GenerateConsoleCtrlEvent (DWORD  ev,    DWORD group);
-UINT WINAPI GetConsoleCP (VOID);
-BOOL WINAPI GetConsoleCursorInfo (HANDLE h, CONSOLE_CURSOR_INFO *info);
-BOOL WINAPI GetConsoleMode (HANDLE h, DWORD * mode);
-UINT WINAPI GetConsoleOutputCP (VOID);
-BOOL WINAPI GetConsoleScreenBufferInfo (HANDLE h, CONSOLE_SCREEN_BUFFER_INFO *
-					ptr);
-
-DWORD WINAPI GetConsoleTitleA (LPSTR str, DWORD len);
-
-
-COORD WINAPI GetLargestConsoleWindowSize (HANDLE h);
-
-BOOL WINAPI GetNumberOfConsoleInputEvents (HANDLE h,
-					   DWORD * n);
-
-BOOL WINAPI GetNumberOfConsoleMouseButtons (DWORD * n);
-
-BOOL WINAPI PeekConsoleInputA (HANDLE h,
-			       INPUT_RECORD * ptr,
-			       DWORD len,
-			       DWORD * done);
-
-
-
-BOOL WINAPI ReadConsoleA (HANDLE h,
-			  VOID * ptr,
-			  DWORD len,
-			  DWORD * done,
-			  VOID * res);
-
-BOOL WINAPI ReadConsoleInputA (HANDLE h,
-			       INPUT_RECORD * ptr,
-			       DWORD len,
-			       DWORD * done);
-
-BOOL WINAPI ReadConsoleOutputA (HANDLE h,
-				CHAR_INFO * ptr,
-				COORD size,
-				COORD fred,
-				SMALL_RECT * reg);
-
-BOOL WINAPI ReadConsoleOutputAttribute (HANDLE h,
-					WORD * attr,
-					DWORD len,
-					COORD rc,
-					DWORD * done);
-
-BOOL WINAPI ReadConsoleOutputCharacterA (HANDLE h,
-					 LPSTR c,
-					 DWORD len,
-					 COORD rc,
-					 DWORD * done);
-
-BOOL WINAPI ScrollConsoleScreenBufferA (HANDLE h,
-					CONST SMALL_RECT * sr,
-					CONST SMALL_RECT * cr,
-					COORD cpos,
-					CONST CHAR_INFO * i);
-
-
-BOOL WINAPI SetConsoleActiveScreenBuffer (HANDLE h);
-BOOL WINAPI SetConsoleCP (UINT i);
-BOOL WINAPI SetConsoleCtrlHandler (HANDLER_ROUTINE * func,  BOOL a);
-
-BOOL WINAPI SetConsoleCursorInfo (HANDLE h,  CONST CONSOLE_CURSOR_INFO * info);
-
-BOOL WINAPI SetConsoleCursorPosition (HANDLE h, COORD pos);
-
-BOOL WINAPI SetConsoleMode (HANDLE h, DWORD mode);
-
-BOOL WINAPI SetConsoleOutputCP (UINT i);
-BOOL WINAPI SetConsoleScreenBufferSize (HANDLE h, COORD size);
-BOOL WINAPI SetConsoleTextAttribute (HANDLE h,
-				     WORD attrs);
-BOOL WINAPI SetConsoleTitleA (const char * str);
-
-BOOL WINAPI SetConsoleWindowInfo (HANDLE h,
-				  BOOL abs, 
-				  CONST SMALL_RECT * wnd);
-
-BOOL WINAPI WriteConsoleA (HANDLE h, 
-			   CONST VOID *   ptr,
-			   DWORD slen,
-			   DWORD * done,
-			   VOID * res);
-
-BOOL WINAPI WriteConsoleInputA (HANDLE	h, 
-				CONST INPUT_RECORD * ptr,
-				DWORD len, 
-				DWORD * done);
-
-BOOL WINAPI WriteConsoleOutputA (HANDLE  h,
-				 CONST CHAR_INFO * ptr,
-				 COORD size, 
-				 COORD fred, 
-				 SMALL_RECT* where);
-
-BOOL WINAPI WriteConsoleOutputAttribute (HANDLE h,
-					 CONST WORD *attr,
-					 DWORD len,
-					 COORD co,
-					 DWORD * done);
-
-BOOL WINAPI WriteConsoleOutputCharacterA (HANDLE h,
-					  const char * c,
-					  DWORD len,
-					  COORD co,
-					  DWORD * done);
+HANDLE CreateConsoleScreenBuffer (DWORD access, DWORD mode,
+                                  CONST SECURITY_ATTRIBUTES * lattr,
+                                  DWORD flags, VOID * ptr);
+BOOL FillConsoleOutputAttribute (HANDLE h, WORD attr, DWORD len,
+                                 COORD co, DWORD * done);
+BOOL FillConsoleOutputCharacterA (HANDLE h, CHAR c, DWORD len,
+                                  COORD co, DWORD * done);
+BOOL FlushBuffer (HANDLE h);
+BOOL FreeConsole (VOID);
+BOOL GenerateConsoleCtrlEvent (DWORD  ev,    DWORD group);
+UINT GetConsoleCP (VOID);
+BOOL GetConsoleCursorInfo (HANDLE h, CONSOLE_CURSOR_INFO *info);
+BOOL GetConsoleMode (HANDLE h, DWORD * mode);
+UINT GetConsoleOutputCP (VOID);
+BOOL GetConsoleScreenBufferInfo (HANDLE h, CONSOLE_SCREEN_BUFFER_INFO * ptr);
+DWORD GetConsoleTitleA (LPSTR str, DWORD len);
+COORD GetLargestConsoleWindowSize (HANDLE h);
+BOOL GetNumberOfConsoleInputEvents (HANDLE h, DWORD * n);
+BOOL GetNumberOfConsoleMouseButtons (DWORD * n);
+BOOL PeekConsoleInputA (HANDLE h, INPUT_RECORD * ptr, DWORD len, DWORD * done);
+BOOL ReadConsoleA (HANDLE h, VOID * ptr, DWORD len, DWORD * done, VOID * res);
+BOOL ReadConsoleInputA (HANDLE h, INPUT_RECORD * ptr, DWORD len, DWORD * done);
+BOOL ReadConsoleOutputA (HANDLE h, CHAR_INFO * ptr, COORD size,
+                         COORD fred, SMALL_RECT * reg);
+BOOL ReadConsoleOutputAttribute (HANDLE h, WORD * attr, DWORD len,
+                                 COORD rc, DWORD * done);
+BOOL ReadConsoleOutputCharacterA (HANDLE h, LPSTR c, DWORD len,
+                                  COORD rc, DWORD * done);
+BOOL ScrollConsoleScreenBufferA (HANDLE h, CONST SMALL_RECT * sr,
+                                 CONST SMALL_RECT * cr, COORD cpos,
+                                 CONST CHAR_INFO * i);
+BOOL SetConsoleActiveScreenBuffer (HANDLE h);
+BOOL SetConsoleCP (UINT i);
+BOOL SetConsoleCtrlHandler (HANDLER_ROUTINE * func,  BOOL a);
+BOOL SetConsoleCursorInfo (HANDLE h,  CONST CONSOLE_CURSOR_INFO * info);
+BOOL SetConsoleCursorPosition (HANDLE h, COORD pos);
+BOOL SetConsoleMode (HANDLE h, DWORD mode);
+BOOL SetConsoleOutputCP (UINT i);
+BOOL SetConsoleScreenBufferSize (HANDLE h, COORD size);
+BOOL SetConsoleTextAttribute (HANDLE h, WORD attrs);
+BOOL SetConsoleTitleA (const char * str);
+BOOL SetConsoleWindowInfo (HANDLE h, BOOL abs, CONST SMALL_RECT * wnd);
+BOOL WriteConsoleA (HANDLE h, CONST VOID *   ptr, DWORD slen,
+                    DWORD * done, VOID * res);
+BOOL WriteConsoleInputA (HANDLE	h, CONST INPUT_RECORD * ptr,
+                         DWORD len, DWORD * done);
+BOOL WriteConsoleOutputA (HANDLE  h, CONST CHAR_INFO * ptr,
+                          COORD size, COORD fred, 
+                          SMALL_RECT* where);
+BOOL WriteConsoleOutputAttribute (HANDLE h, CONST WORD *attr, DWORD len,
+                                  COORD co, DWORD * done);
+BOOL WriteConsoleOutputCharacterA (HANDLE h, const char * c, DWORD len,
+                                   COORD co, DWORD * done);
 #endif
 #endif
 
diff --git a/include/windows.h b/include/windows.h
index 3a0ff78..d48cd6b 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -4,6 +4,7 @@
 #define WINDOWS_H
 
 #include "wintypes.h"
+#include "winuser.h"
 
 #ifndef WINELIB
 #pragma pack(1)
@@ -42,47 +43,6 @@
 typedef PAINTSTRUCT *NPPAINTSTRUCT;
 typedef PAINTSTRUCT *LPPAINTSTRUCT;
 
-
-  /* Window classes */
-
-typedef struct {
-	WORD	style;
-	WNDPROC	lpfnWndProc WINE_PACKED;
-	INT	cbClsExtra, cbWndExtra;
-	HANDLE	hInstance;
-	HICON	hIcon;
-	HCURSOR	hCursor;
-	HBRUSH	hbrBackground;
-	SEGPTR  lpszMenuName WINE_PACKED;
-	SEGPTR  lpszClassName WINE_PACKED;
-} WNDCLASS, *LPWNDCLASS;
-
-#define CS_VREDRAW          0x0001
-#define CS_HREDRAW          0x0002
-#define CS_KEYCVTWINDOW     0x0004
-#define CS_DBLCLKS          0x0008
-#define CS_OWNDC            0x0020
-#define CS_CLASSDC          0x0040
-#define CS_PARENTDC         0x0080
-#define CS_NOKEYCVT         0x0100
-#define CS_NOCLOSE          0x0200
-#define CS_SAVEBITS         0x0800
-#define CS_BYTEALIGNCLIENT  0x1000
-#define CS_BYTEALIGNWINDOW  0x2000
-#define CS_GLOBALCLASS      0x4000
-
-  /* Offsets for GetClassLong() and GetClassWord() */
-#define GCL_MENUNAME        (-8)
-#define GCW_HBRBACKGROUND   (-10)
-#define GCW_HCURSOR         (-12)
-#define GCW_HICON           (-14)
-#define GCW_HMODULE         (-16)
-#define GCW_CBWNDEXTRA      (-18)
-#define GCW_CBCLSEXTRA      (-20)
-#define GCL_WNDPROC         (-24)
-#define GCW_STYLE           (-26)
-#define GCW_ATOM            (-32)
-
   /* Windows */
 
 typedef struct {
@@ -206,8 +166,8 @@
   /* WM_NCCALCSIZE parameter structure */
 typedef struct
 {
-    RECT	   rgrc[3];
-    WINDOWPOS FAR* lppos;
+    RECT    rgrc[3];
+    SEGPTR  lppos;
 } NCCALCSIZE_PARAMS;
 
   /* WM_NCCALCSIZE return flags */
@@ -423,8 +383,6 @@
   POINT	  pt WINE_PACKED;
 } MSG, *LPMSG;
 	
-typedef WORD ATOM;
-
 #define MAKEINTATOM(i)   ((SEGPTR)MAKELONG((i),0))
 
   /* Raster operations */
@@ -1224,8 +1182,7 @@
     char EofChar;
     char EvtChar;
     UINT TxDelay WINE_PACKED;
-} DCB;
-typedef DCB FAR* LPDCB;
+} DCB, *LPDCB;
 
 typedef struct tagCOMSTAT
 {
@@ -1443,7 +1400,7 @@
 	HANDLE  hOfStruct;
 	POINT	pt WINE_PACKED;
 	LONG	l  WINE_PACKED;
-}	DRAGINFO, FAR* LPDRAGINFO;
+} DRAGINFO, *LPDRAGINFO;
 
 #define DRAGOBJ_PROGRAM		0x0001
 #define DRAGOBJ_DATA		0x0002
@@ -1877,6 +1834,11 @@
 #define SW_INVALIDATE          0x0002
 #define SW_ERASE               0x0003
 
+/* CreateWindow() coordinates */
+#define CW_USEDEFAULT16 ((INT16)0x8000)
+#define CW_USEDEFAULT32 ((INT32)0x80000000)
+#define CW_USEDEFAULT   WINELIB_NAME(CW_USEDEFAULT)
+
 /* Button control styles */
 #define BS_PUSHBUTTON          0x00000000L
 #define BS_DEFPUSHBUTTON       0x00000001L
@@ -2163,9 +2125,6 @@
 #define EM_SCROLL              (WM_USER+5)
 #define EM_GETTHUMB            (WM_USER+14)
 
-typedef int (CALLBACK *EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent,
-					  int cch, int code);
-
 /* EDITWORDBREAKPROC code values */
 #define WB_LEFT         0
 #define WB_RIGHT        1
@@ -2193,9 +2152,7 @@
     HDC         hDC;
     RECT        rcItem WINE_PACKED;
     DWORD       itemData WINE_PACKED;
-} DRAWITEMSTRUCT;
-typedef DRAWITEMSTRUCT NEAR* PDRAWITEMSTRUCT;
-typedef DRAWITEMSTRUCT FAR* LPDRAWITEMSTRUCT;
+} DRAWITEMSTRUCT, *PDRAWITEMSTRUCT, *LPDRAWITEMSTRUCT;
 
 typedef struct
 {
@@ -2205,9 +2162,7 @@
     UINT        itemWidth;
     UINT        itemHeight;
     DWORD       itemData WINE_PACKED;
-} MEASUREITEMSTRUCT;
-typedef MEASUREITEMSTRUCT NEAR* PMEASUREITEMSTRUCT;
-typedef MEASUREITEMSTRUCT FAR* LPMEASUREITEMSTRUCT;
+} MEASUREITEMSTRUCT, *PMEASUREITEMSTRUCT, *LPMEASUREITEMSTRUCT;
 
 typedef struct
 {
@@ -2216,9 +2171,7 @@
     UINT       itemID;
     HWND       hwndItem;
     DWORD      itemData;
-} DELETEITEMSTRUCT;
-typedef DELETEITEMSTRUCT NEAR* PDELETEITEMSTRUCT;
-typedef DELETEITEMSTRUCT FAR* LPDELETEITEMSTRUCT;
+} DELETEITEMSTRUCT, *PDELETEITEMSTRUCT, *LPDELETEITEMSTRUCT;
 
 typedef struct
 {
@@ -2229,9 +2182,7 @@
     DWORD       itemData1;
     UINT        itemID2;
     DWORD       itemData2 WINE_PACKED;
-} COMPAREITEMSTRUCT;
-typedef COMPAREITEMSTRUCT NEAR* PCOMPAREITEMSTRUCT;
-typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT;
+} COMPAREITEMSTRUCT, *PCOMPAREITEMSTRUCT, *LPCOMPAREITEMSTRUCT;
 
 /* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags */
 #define KF_EXTENDED         0x0100
@@ -2340,6 +2291,7 @@
 #define GMEM_LOWER          GMEM_NOT_BANKED
 #define GMEM_DISCARDED      0x4000
 #define GMEM_LOCKCOUNT      0x00ff
+#define GMEM_INVALID_HANDLE 0x8000
 
 #define GHND                (GMEM_MOVEABLE | GMEM_ZEROINIT)
 #define GPTR                (GMEM_FIXED | GMEM_ZEROINIT)
@@ -2616,7 +2568,7 @@
 #define HELP_SETWINPOS      0x0203
 
 typedef struct {
-        TCHAR  dmDeviceName[32];
+        CHAR   dmDeviceName[32];
         WORD   dmSpecVersion;
         WORD   dmDriverVersion;
         WORD   dmSize;
@@ -2635,7 +2587,7 @@
         short  dmYResolution;
         short  dmTTOption;
         short  dmCollate;
-        TCHAR  dmFormName[32];
+        CHAR   dmFormName[32];
         WORD   dmUnusedPadding;
         WORD   dmBitsPerPel;
         DWORD  dmPelsWidth;
@@ -2718,7 +2670,7 @@
 HDC        CreateCompatibleDC(HDC);
 HCURSOR    CreateCursor(HANDLE,INT,INT,INT,INT,const BYTE*,const BYTE*);
 HANDLE     CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,const BYTE*,const BYTE*);
-HDC        CreateDC(LPCTSTR,LPCTSTR,LPCTSTR,const DEVMODE*);
+HDC        CreateDC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
 HBRUSH     CreateDIBPatternBrush(HGLOBAL,UINT);
 HBITMAP    CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
 HWND       CreateDialog(HINSTANCE,SEGPTR,HWND,DLGPROC);
@@ -2731,23 +2683,21 @@
 HFONT      CreateFont(INT,INT,INT,INT,INT,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
 HFONT      CreateFontIndirect(const LOGFONT*);
 HBRUSH     CreateHatchBrush(INT,COLORREF);
-HDC        CreateIC(LPCTSTR,LPCTSTR,LPCTSTR,const DEVMODE*);
+HDC        CreateIC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
 HICON      CreateIcon(HINSTANCE,INT,INT,BYTE,BYTE,const BYTE*,const BYTE*);
 HMENU      CreateMenu(void);
-HDC        CreateMetaFile(LPCTSTR);
+HDC        CreateMetaFile(LPCSTR);
 HPALETTE   CreatePalette(const LOGPALETTE*);
 HBRUSH     CreatePatternBrush(HBITMAP);
 HPEN       CreatePen(INT,INT,COLORREF);
 HPEN       CreatePenIndirect(const LOGPEN*);
-HRGN       CreatePolyPolygonRgn(const POINT*,const INT*,INT,INT);
+HRGN       CreatePolyPolygonRgn(const POINT*,const INT16*,INT,INT);
 HRGN       CreatePolygonRgn(const POINT*,INT,INT);
 HMENU      CreatePopupMenu(void);
 HRGN       CreateRectRgn(INT,INT,INT,INT);
 HRGN       CreateRectRgnIndirect(const RECT*);
 HRGN       CreateRoundRectRgn(INT,INT,INT,INT,INT,INT);
 HBRUSH     CreateSolidBrush(COLORREF);
-HWND       CreateWindow(SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR);
-HWND       CreateWindowEx(DWORD,SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR);
 BOOL       DPtoLP(HDC,LPPOINT,INT);
 void       DebugBreak(void);
 LRESULT    DefDlgProc(HWND,UINT,WPARAM,LPARAM);
@@ -2782,7 +2732,7 @@
 void       DrawFocusRect(HDC,const RECT*);
 BOOL       DrawIcon(HDC,INT,INT,HICON);
 void       DrawMenuBar(HWND);
-INT        DrawText(HDC,LPCTSTR,INT,LPRECT,UINT);
+INT        DrawText(HDC,LPCSTR,INT,LPRECT,UINT);
 DWORD      DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
 BOOL       Ellipse(HDC,INT,INT,INT,INT);
 BOOL       EmptyClipboard(void);
@@ -2795,8 +2745,8 @@
 BOOL       EndPaint(HWND,const PAINTSTRUCT*);
 BOOL       EnumChildWindows(HWND,WNDENUMPROC,LPARAM);
 UINT       EnumClipboardFormats(UINT);
-INT        EnumFontFamilies(HDC,LPCTSTR,FONTENUMPROC,LPARAM);
-INT        EnumFonts(HDC,LPCTSTR,FONTENUMPROC,LPARAM);
+INT        EnumFontFamilies(HDC,LPCSTR,FONTENUMPROC,LPARAM);
+INT        EnumFonts(HDC,LPCSTR,FONTENUMPROC,LPARAM);
 BOOL       EnumMetaFile(HDC,HMETAFILE,MFENUMPROC,LPARAM);
 INT        EnumObjects(HDC,INT,GOBJENUMPROC,LPARAM);
 INT        EnumProps(HWND,PROPENUMPROC);
@@ -2811,7 +2761,7 @@
 int        ExcludeVisRect(HDC,short,short,short,short);
 BOOL       ExitWindows(DWORD,WORD);
 BOOL       ExtFloodFill(HDC,INT,INT,COLORREF,WORD);
-BOOL       ExtTextOut(HDC,short,short,WORD,LPRECT,LPSTR,WORD,LPINT);
+BOOL       ExtTextOut(HDC,short,short,WORD,LPRECT,LPSTR,WORD,LPINT16);
 HICON      ExtractIcon(HINSTANCE,LPCSTR,WORD);
 WORD       FarGetOwner(HANDLE);
 void       FarSetOwner(HANDLE,HANDLE);
@@ -2824,6 +2774,7 @@
 HINSTANCE  FindExecutable(LPCSTR,LPCSTR,LPSTR);
 HRSRC      FindResource(HINSTANCE,SEGPTR,SEGPTR);
 HWND       FindWindow(SEGPTR,LPSTR);
+HWND       FindWindowEx(HWND,HWND,SEGPTR,LPSTR);
 BOOL       FlashWindow(HWND,BOOL);
 BOOL       FloodFill(HDC,INT,INT,COLORREF);
 int        FlushComm(int,int);
@@ -2852,10 +2803,7 @@
 WORD       GetCaretBlinkTime(void);
 void       GetCaretPos(LPPOINT);
 BOOL       GetCharABCWidths(HDC,UINT,UINT,LPABC);
-BOOL       GetCharWidth(HDC,WORD,WORD,LPINT);
-BOOL       GetClassInfo(HANDLE,SEGPTR,LPWNDCLASS);
-LONG       GetClassLong(HWND,short);
-int        GetClassName(HWND,LPSTR,short);
+BOOL       GetCharWidth(HDC,WORD,WORD,LPINT16);
 WORD       GetClassWord(HWND,short);
 void       GetClientRect(HWND,LPRECT);
 int        GetClipBox(HDC,LPRECT);
@@ -2897,7 +2845,7 @@
 int        GetEnvironment(LPSTR,LPSTR,WORD);
 HMODULE    GetExePtr(HANDLE);
 HWND       GetFocus(void);
-DWORD      GetFreeSpace(WORD);
+DWORD      GetFreeSpace(UINT16);
 DWORD      GetHeapSpaces(HMODULE);
 BOOL       GetInputState(void);
 int        GetInstanceData(HANDLE,WORD,int);
@@ -2952,7 +2900,7 @@
 WORD       GetRelAbs(HDC);
 int        GetRgnBox(HRGN,LPRECT);
 int        GetScrollPos(HWND,int);
-void       GetScrollRange(HWND,int,LPINT,LPINT);
+void       GetScrollRange(HWND,int,LPINT16,LPINT16);
 DWORD      GetSelectorBase(WORD);
 DWORD      GetSelectorLimit(WORD);
 HANDLE     GetStockObject(int);
@@ -2966,7 +2914,7 @@
 WORD       GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
 WORD       GetSystemPaletteUse(HDC);
 VOID       GetSystemTime(LPSYSTEMTIME); /* Win32 */
-DWORD      GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT);
+DWORD      GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT16);
 HINSTANCE  GetTaskDS(void);
 HQUEUE     GetTaskQueue(HTASK);
 BYTE       GetTempDrive(BYTE);
@@ -2978,7 +2926,7 @@
 BOOL       GetTextExtentPoint(HDC,LPCSTR,short,LPSIZE);
 INT        GetTextFace(HDC,INT,LPSTR);
 BOOL       GetTextMetrics(HDC,LPTEXTMETRIC);
-LPINT      GetThresholdEvent(void);
+LPINT16    GetThresholdEvent(void);
 int        GetThresholdStatus(void);
 DWORD      GetTickCount(void);
 HWND       GetTopWindow(HWND);
@@ -3006,34 +2954,21 @@
 WORD       GetWindowWord(HWND,short);
 UINT       GetWindowsDirectory(LPSTR,UINT);
 ATOM       GlobalAddAtom(SEGPTR);
-HGLOBAL    GlobalAlloc(WORD,DWORD);
-DWORD      GlobalCompact(DWORD);
 DWORD      GlobalDOSAlloc(DWORD);
 WORD       GlobalDOSFree(WORD);
 ATOM       GlobalDeleteAtom(ATOM);
 ATOM       GlobalFindAtom(SEGPTR);
-void       GlobalFix(HGLOBAL);
-WORD       GlobalFlags(HGLOBAL);
-HGLOBAL    GlobalFree(HGLOBAL);
-void       GlobalFreeAll(HANDLE);
+void       GlobalFix(HGLOBAL16);
+void       GlobalFreeAll(HGLOBAL16);
 WORD       GlobalGetAtomName(ATOM,LPSTR,short);
-#ifdef WINELIB32
-HGLOBAL    GlobalHandle(LPCVOID); /* Win32 */
-#else
-DWORD      GlobalHandle(UINT); /* Win16 */
-#endif
-HGLOBAL    GlobalLRUNewest(HGLOBAL);
-HGLOBAL    GlobalLRUOldest(HGLOBAL);
-LPVOID     GlobalLock(HGLOBAL);
+HGLOBAL16  GlobalLRUNewest(HGLOBAL16);
+HGLOBAL16  GlobalLRUOldest(HGLOBAL16);
 void       GlobalNotify(FARPROC);
-WORD       GlobalPageLock(HGLOBAL);
-WORD       GlobalPageUnlock(HGLOBAL);
-HGLOBAL    GlobalReAlloc(HGLOBAL,DWORD,WORD);
-DWORD      GlobalSize(HGLOBAL);
-BOOL       GlobalUnWire(HGLOBAL);
-void       GlobalUnfix(HGLOBAL);
-BOOL       GlobalUnlock(HGLOBAL);
-SEGPTR     GlobalWire(HGLOBAL);
+WORD       GlobalPageLock(HGLOBAL16);
+WORD       GlobalPageUnlock(HGLOBAL16);
+BOOL       GlobalUnWire(HGLOBAL16);
+void       GlobalUnfix(HGLOBAL16);
+SEGPTR     GlobalWire(HGLOBAL16);
 BOOL       GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
 void       HideCaret(HWND);
 BOOL       HiliteMenuItem(HWND,HMENU,UINT,UINT);
@@ -3089,18 +3024,8 @@
 HANDLE     LoadModule(LPCSTR,LPVOID);
 HGLOBAL    LoadResource(HINSTANCE,HRSRC);
 int        LoadString(HANDLE,WORD,LPSTR,int);
-HANDLE     LocalAlloc(WORD,WORD);
-UINT       LocalCompact(WORD);
-UINT       LocalFlags(HLOCAL);
-HANDLE     LocalFree(HANDLE);
-HANDLE     LocalHandle(WORD);
 BOOL       LocalInit(HANDLE,WORD,WORD);
-NPVOID     LocalLock(HLOCAL);
 FARPROC    LocalNotify(FARPROC);
-HANDLE     LocalReAlloc(HANDLE,WORD,WORD);
-UINT       LocalShrink(HANDLE,WORD);
-UINT       LocalSize(HLOCAL);
-BOOL       LocalUnlock(HANDLE);
 LPVOID     LockResource(HGLOBAL);
 HGLOBAL    LockSegment(HGLOBAL);
 HMENU      LookupMenuHandle(HMENU,INT);
@@ -3114,7 +3039,6 @@
 DWORD      MoveTo(HDC,short,short);
 BOOL       MoveToEx(HDC,short,short,LPPOINT);
 BOOL       MoveWindow(HWND,short,short,short,short,BOOL);
-INT        MulDiv(INT,INT,INT);
 DWORD      OemKeyScan(WORD);
 BOOL       OemToAnsi(LPSTR,LPSTR);
 void       OemToAnsiBuff(LPSTR,LPSTR,INT);
@@ -3130,7 +3054,7 @@
 HFILE      OpenFile(LPCSTR,OFSTRUCT*,UINT);
 BOOL       OpenIcon(HWND);
 int        OpenSound(void);
-void       OutputDebugString(LPSTR);
+void       OutputDebugString(LPCSTR);
 void       PaintRect(HWND,HWND,HDC,HBRUSH,LPRECT);
 BOOL       PaintRgn(HDC,HRGN);
 BOOL       PatBlt(HDC,short,short,short,short,DWORD);
@@ -3138,7 +3062,7 @@
 BOOL       Pie(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
 BOOL       PlayMetaFile(HDC,HANDLE);
 void       PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,WORD);
-BOOL       PolyPolygon(HDC,LPPOINT,LPINT,WORD);
+BOOL       PolyPolygon(HDC,LPPOINT,LPINT16,WORD);
 BOOL       Polygon(HDC,LPPOINT,int);
 BOOL       Polyline(HDC,LPPOINT,int);
 BOOL       PostAppMessage(HANDLE,WORD,WORD,LONG);
@@ -3212,7 +3136,6 @@
 		LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,FILETIME*);
 DWORD      RegQueryInfoKeyA(HKEY,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
 		LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,FILETIME*);
-ATOM       RegisterClass(LPWNDCLASS);
 WORD       RegisterClipboardFormat(LPCSTR);
 WORD       RegisterWindowMessage(SEGPTR);
 void       ReleaseCapture(void);
@@ -3254,7 +3177,6 @@
 HWND       SetCapture(HWND);
 void       SetCaretBlinkTime(WORD);
 void       SetCaretPos(short,short);
-LONG       SetClassLong(HWND,short,LONG);
 WORD       SetClassWord(HWND,short,WORD);
 HANDLE     SetClipboardData(WORD,HANDLE);
 HWND       SetClipboardViewer(HWND);
@@ -3303,7 +3225,7 @@
 int        SetSoundNoise(int,int);
 WORD       SetStretchBltMode(HDC,WORD);
 LONG       SetSwapAreaSize(WORD);
-void       SetSysColors(int,LPINT,COLORREF*);
+void       SetSysColors(int,LPINT16,COLORREF*);
 HWND       SetSysModalWindow(HWND);
 WORD       SetSystemPaletteUse(HDC,WORD);
 WORD       SetSystemTimer(HWND,WORD,WORD,FARPROC);
@@ -3354,7 +3276,7 @@
 void       SwitchStackTo(WORD,WORD,WORD);
 int        SyncAllVoices(void);
 BOOL       SystemParametersInfo(UINT,UINT,LPVOID,UINT);
-LONG       TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT,short);
+LONG       TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT16,short);
 BOOL       TextOut(HDC,short,short,LPSTR,short);
 int        Throw(LPCATCHBUF,int);
 int        ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
@@ -3369,7 +3291,6 @@
 BOOL       UnionRect(LPRECT,LPRECT,LPRECT);
 void       UnlockSegment(HGLOBAL);
 BOOL       UnrealizeObject(HBRUSH);
-BOOL       UnregisterClass(SEGPTR,HANDLE);
 int        UpdateColors(HDC);
 void       UpdateWindow(HWND);
 void       ValidateCodeSegments(void);
@@ -3377,7 +3298,7 @@
 void       ValidateRect(HWND,LPRECT);
 void       ValidateRgn(HWND,HRGN);
 WORD       VkKeyScan(WORD);
-SEGPTR     WIN16_GlobalLock(HGLOBAL);
+SEGPTR     WIN16_GlobalLock16(HGLOBAL16);
 SEGPTR     WIN16_LockResource(HANDLE);
 SEGPTR     WIN16_lstrcpyn(SEGPTR,SEGPTR,WORD);
 void       WaitMessage(void);
@@ -3407,7 +3328,85 @@
 LPSTR      lstrcpyn(LPSTR,LPCSTR,int);
 INT        lstrlen(LPCSTR);
 int        wsprintf(LPSTR,LPSTR,...);
-int        wvsprintf(LPSTR,LPSTR,LPSTR);
+int        wvsprintf(LPSTR,LPCSTR,LPCSTR);
+
+
+/* Declarations for functions that exist both in Win16 and Win32 */
+
+HWND       CreateWindow16(SEGPTR,SEGPTR,DWORD,INT16,INT16,INT16,INT16,HWND,HMENU,HINSTANCE,SEGPTR);
+#define    CreateWindow32A(className,titleName,style,x,y,width,height,\
+                           parent,menu,instance,param) \
+           CreateWindowEx32A(0,className,titleName,style,x,y,width,height,\
+                           parent,menu,instance,param)
+#define    CreateWindow32W(className,titleName,style,x,y,width,height,\
+                           parent,menu,instance,param) \
+           CreateWindowEx32W(0,className,titleName,style,x,y,width,height,\
+                           parent,menu,instance,param)
+#define    CreateWindow WINELIB_NAME_AW(CreateWindow)
+HWND       CreateWindowEx16(DWORD,SEGPTR,SEGPTR,DWORD,INT16,INT16,INT16,INT16,HWND,HMENU,HINSTANCE,SEGPTR);
+HWND32     CreateWindowEx32A(DWORD,LPCSTR,LPCSTR,DWORD,INT32,INT32,INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
+HWND32     CreateWindowEx32W(DWORD,LPCWSTR,LPCWSTR,DWORD,INT32,INT32,INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
+#define    CreateWindowEx WINELIB_NAME_AW(CreateWindowEx)
+HGLOBAL16  GlobalAlloc16(UINT16,DWORD);
+HGLOBAL32  GlobalAlloc32(UINT32,DWORD);
+#define    GlobalAlloc WINELIB_NAME(GlobalAlloc)
+DWORD      GlobalCompact16(DWORD);
+DWORD      GlobalCompact32(DWORD);
+#define    GlobalCompact WINELIB_NAME(GlobalCompact)
+UINT16     GlobalFlags16(HGLOBAL16);
+UINT32     GlobalFlags32(HGLOBAL32);
+#define    GlobalFlags WINELIB_NAME(GlobalFlags)
+HGLOBAL16  GlobalFree16(HGLOBAL16);
+HGLOBAL32  GlobalFree32(HGLOBAL32);
+#define    GlobalFree WINELIB_NAME(GlobalFree)
+DWORD      GlobalHandle16(WORD);
+HGLOBAL32  GlobalHandle32(LPCVOID);
+#define    GlobalHandle WINELIB_NAME(GlobalHandle)
+LPVOID     GlobalLock16(HGLOBAL16);
+LPVOID     GlobalLock32(HGLOBAL32);
+#define    GlobalLock WINELIB_NAME(GlobalLock)
+HGLOBAL16  GlobalReAlloc16(HGLOBAL16,DWORD,UINT16);
+HGLOBAL32  GlobalReAlloc32(HGLOBAL32,DWORD,UINT32);
+#define    GlobalReAlloc WINELIB_NAME(GlobalReAlloc)
+DWORD      GlobalSize16(HGLOBAL16);
+DWORD      GlobalSize32(HGLOBAL32);
+#define    GlobalSize WINELIB_NAME(GlobalSize)
+BOOL       GlobalUnlock16(HGLOBAL16);
+BOOL       GlobalUnlock32(HGLOBAL32);
+#define    GlobalUnlock WINELIB_NAME(GlobalUnlock)
+HLOCAL16   LocalAlloc16(UINT16,WORD);
+HLOCAL32   LocalAlloc32(UINT32,DWORD);
+#define    LocalAlloc WINELIB_NAME(LocalAlloc)
+UINT16     LocalCompact16(UINT16);
+UINT32     LocalCompact32(UINT32);
+#define    LocalCompact WINELIB_NAME(LocalCompact)
+UINT16     LocalFlags16(HLOCAL16);
+UINT32     LocalFlags32(HLOCAL32);
+#define    LocalFlags WINELIB_NAME(LocalFlags)
+HLOCAL16   LocalFree16(HLOCAL16);
+HLOCAL32   LocalFree32(HLOCAL32);
+#define    LocalFree WINELIB_NAME(LocalFree)
+HLOCAL16   LocalHandle16(WORD);
+HLOCAL32   LocalHandle32(LPCVOID);
+#define    LocalHandle WINELIB_NAME(LocalHandle)
+SEGPTR     LocalLock16(HLOCAL16);
+LPVOID     LocalLock32(HLOCAL32);
+#define    LocalLock WINELIB_NAME(LocalLock)
+HLOCAL16   LocalReAlloc16(HLOCAL16,WORD,UINT16);
+HLOCAL32   LocalReAlloc32(HLOCAL32,DWORD,UINT32);
+#define    LocalReAlloc WINELIB_NAME(LocalReAlloc)
+UINT16     LocalShrink16(HGLOBAL16,UINT16);
+UINT32     LocalShrink32(HGLOBAL32,UINT32);
+#define    LocalShrink WINELIB_NAME(LocalShrink)
+UINT16     LocalSize16(HLOCAL16);
+UINT32     LocalSize32(HLOCAL32);
+#define    LocalSize WINELIB_NAME(LocalSize)
+BOOL       LocalUnlock16(HLOCAL16);
+BOOL       LocalUnlock32(HLOCAL32);
+#define    LocalUnlock WINELIB_NAME(LocalUnlock)
+INT16      MulDiv16(INT16,INT16,INT16);
+INT32      MulDiv32(INT32,INT32,INT32);
+#define    MulDiv WINELIB_NAME(MulDiv)
 
 #ifdef WINELIB
 #define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
diff --git a/include/winpos.h b/include/winpos.h
index 4ec7319..94d2dc5 100644
--- a/include/winpos.h
+++ b/include/winpos.h
@@ -37,7 +37,7 @@
 extern BOOL WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg );
 extern LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect,
 				   RECT *newWindowRect, RECT *oldWindowRect,
-				   RECT *oldClientRect, WINDOWPOS *winpos,
+				   RECT *oldClientRect, SEGPTR winpos,
 				   RECT *newClientRect );
 extern LONG WINPOS_HandleWindowPosChanging( WINDOWPOS *winpos );
 extern INT WINPOS_WindowFromPoint( POINT pt, WND **ppWnd );
diff --git a/include/winsock.h b/include/winsock.h
index 4fbfb1d..c22e2e1 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -22,7 +22,7 @@
  */
 typedef u_int	SOCKET;
 
-extern int PASCAL FAR __WSAFDIsSet(SOCKET, fd_set FAR *);
+extern int __WSAFDIsSet(SOCKET, fd_set *);
 
 /*
  * Internet address (old style... should be updated)
@@ -46,10 +46,8 @@
         char                    szSystemStatus[WSASYS_STATUS_LEN+1];
         unsigned short          iMaxSockets;
         unsigned short          iMaxUdpDg;
-        char FAR *              lpVendorInfo;
-} WSADATA;
-
-typedef WSADATA FAR *LPWSADATA;
+        char                   *lpVendorInfo;
+} WSADATA, *LPWSADATA;
 
 /*
  * This is used instead of -1, since the
@@ -192,91 +190,44 @@
 
 /* Microsoft Windows Extension function prototypes */
 
-INT PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
-
-INT PASCAL FAR WSACleanup(void);
-
-void PASCAL FAR WSASetLastError(INT iError);
-
-INT PASCAL FAR WSAGetLastError(void);
-
-BOOL PASCAL FAR WSAIsBlocking(void);
-
-INT PASCAL FAR WSAUnhookBlockingHook(void);
-
-FARPROC PASCAL FAR WSASetBlockingHook(FARPROC lpBlockFunc);
-
-INT PASCAL FAR WSACancelBlockingCall(void);
-
-HANDLE PASCAL FAR WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
-                                        const char FAR *name, 
-                                        const char FAR *proto,
-                                        char FAR *buf, INT buflen);
-
-HANDLE PASCAL FAR WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port,
-                                        const char FAR *proto, char FAR *buf,
-                                        INT buflen);
-
-HANDLE PASCAL FAR WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg,
-                                         const char FAR *name, char FAR *buf,
-                                         INT buflen);
-
-HANDLE PASCAL FAR WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg,
-                                           INT number, char FAR *buf,
-                                           INT buflen);
-
-HANDLE PASCAL FAR WSAAsyncGetHostByName(HWND hWnd, u_int wMsg,
-                                        const char FAR *name, char FAR *buf,
-                                        INT buflen);
-
-HANDLE PASCAL FAR WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg,
-                                        const char FAR *addr, INT len, INT type,
-                                        char FAR *buf, INT buflen);
-
-INT PASCAL FAR WSACancelAsyncRequest(HANDLE hAsyncTaskHandle);
-
-INT PASCAL FAR WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);
+INT WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
+INT WSACleanup(void);
+void WSASetLastError(INT iError);
+INT WSAGetLastError(void);
+BOOL WSAIsBlocking(void);
+INT WSAUnhookBlockingHook(void);
+FARPROC WSASetBlockingHook(FARPROC lpBlockFunc);
+INT WSACancelBlockingCall(void);
+HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
+                             LPCSTR name, LPCSTR proto,
+                             LPSTR buf, INT buflen);
+HANDLE WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port,
+                             LPCSTR proto, LPSTR buf, INT buflen);
+HANDLE WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg,
+                              LPCSTR name, LPSTR buf, INT buflen);
+HANDLE WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg,
+                                INT number, LPSTR buf, INT buflen);
+HANDLE WSAAsyncGetHostByName(HWND hWnd, u_int wMsg,
+                             LPCSTR name, LPSTR buf, INT buflen);
+HANDLE WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, LPCSTR addr, INT len,
+                             INT type, LPSTR buf, INT buflen);
+INT WSACancelAsyncRequest(HANDLE hAsyncTaskHandle);
+INT WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);
 
 #ifdef __cplusplus
 }
 #endif
 
 /* Microsoft Windows Extended data types */
-typedef struct sockaddr SOCKADDR;
-typedef struct sockaddr *PSOCKADDR;
-typedef struct sockaddr FAR *LPSOCKADDR;
-
-typedef struct sockaddr_in SOCKADDR_IN;
-typedef struct sockaddr_in *PSOCKADDR_IN;
-typedef struct sockaddr_in FAR *LPSOCKADDR_IN;
-
-typedef struct linger LINGER;
-typedef struct linger *PLINGER;
-typedef struct linger FAR *LPLINGER;
-
-typedef struct in_addr IN_ADDR;
-typedef struct in_addr *PIN_ADDR;
-typedef struct in_addr FAR *LPIN_ADDR;
-
-typedef struct fd_set FD_SET;
-typedef struct fd_set *PFD_SET;
-typedef struct fd_set FAR *LPFD_SET;
-
-typedef struct hostent HOSTENT;
-typedef struct hostent *PHOSTENT;
-typedef struct hostent FAR *LPHOSTENT;
-
-typedef struct servent SERVENT;
-typedef struct servent *PSERVENT;
-typedef struct servent FAR *LPSERVENT;
-
-typedef struct protoent PROTOENT;
-typedef struct protoent *PPROTOENT;
-typedef struct protoent FAR *LPPROTOENT;
-
-typedef struct timeval TIMEVAL;
-typedef struct timeval *PTIMEVAL;
-typedef struct timeval FAR *LPTIMEVAL;
+typedef struct sockaddr SOCKADDR, *PSOCKADDR, *LPSOCKADDR;
+typedef struct sockaddr_in SOCKADDR_IN, *PSOCKADDR_IN, *LPSOCKADDR_IN;
+typedef struct linger LINGER, *PLINGER, *LPLINGER;
+typedef struct in_addr IN_ADDR, *PIN_ADDR, *LPIN_ADDR;
+typedef struct fd_set FD_SET, *PFD_SET, *LPFD_SET;
+typedef struct hostent HOSTENT, *PHOSTENT, *LPHOSTENT;
+typedef struct servent SERVENT, *PSERVENT, *LPSERVENT;
+typedef struct protoent PROTOENT, *PPROTOENT, *LPPROTOENT;
+typedef struct timeval TIMEVAL, *PTIMEVAL, *LPTIMEVAL;
 
 /*
  * Windows message parameter composition and decomposition
diff --git a/include/wintypes.h b/include/wintypes.h
index afce262..a9bbe79 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -1,3 +1,9 @@
+/*
+ * Basic types definitions
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
 #ifndef __WINE_WINTYPES_H
 #define __WINE_WINTYPES_H
 
@@ -19,70 +25,99 @@
 # endif
 #endif
 
-typedef short INT16;
-typedef unsigned short UINT16;
-typedef int INT32;
-typedef unsigned int UINT32;
+/* Macros to map Winelib names to the correct implementation name */
+/* depending on WINELIB16, WINELIB32 and UNICODE macros.          */
 
-typedef unsigned short WORD;
-typedef unsigned long DWORD;
-typedef unsigned short BOOL;
-typedef unsigned char BYTE;
-typedef long LONG;
-typedef unsigned char CHAR;
+#ifdef WINELIB
+# ifdef WINELIB32
+#  define WINELIB_NAME(func)     func##32
+#  ifdef UNICODE
+#   define WINELIB_NAME_AW(func) func##32W
+#  else
+#   define WINELIB_NAME_AW(func) func##32A
+#  endif  /* UNICODE */
+# else   /* WINELIB32 */
+#  define WINELIB_NAME(func)     func##16
+#  define WINELIB_NAME_AW(func)  func##16
+# endif  /* WINELIB32 */
+#else   /* WINELIB */
+# define WINELIB_NAME(func)      /* nothing */
+# define WINELIB_NAME_AW(func)   /* nothing */
+#endif  /* WINELIB */
+
+#ifdef WINELIB
+# define DECL_WINELIB_TYPE(type)     typedef WINELIB_NAME(type) type
+# define DECL_WINELIB_TYPE_AW(type)  typedef WINELIB_NAME_AW(type) type
+#else   /* WINELIB */
+# define DECL_WINELIB_TYPE(type)     /* nothing */
+# define DECL_WINELIB_TYPE_AW(type)  /* nothing */
+#endif  /* WINELIB */
+
+/* Standard data types. These are the same for emulator and library. */
+
+typedef void            VOID;
+typedef short           INT16;
+typedef unsigned short  UINT16;
+typedef int             INT32;
+typedef unsigned int    UINT32;
+typedef unsigned short  WORD;
+typedef unsigned long   DWORD;
+typedef unsigned short  BOOL;
+typedef unsigned char   BYTE;
+typedef long            LONG;
+typedef char            CHAR;
 /* Some systems might have wchar_t, but we really need 16 bit characters */
-typedef unsigned short WCHAR;
+typedef unsigned short  WCHAR;
 
-#ifdef WINELIB32
-typedef int INT;
-typedef unsigned int UINT;
-typedef char TCHAR;  /* Should probably eventually be unsigned short */
-typedef void* NPVOID;
+/* Handles types. These are the same for emulator and library. */
+
+typedef UINT16          HANDLE16;
+typedef UINT32          HANDLE32;
+typedef UINT16          WPARAM16;
+typedef UINT32          WPARAM32;
+typedef LONG            LPARAM;
+typedef LONG            LRESULT;
+typedef WORD            ATOM;
+typedef WORD            CATCHBUF[9];
+typedef WORD           *LPCATCHBUF;
+typedef DWORD           ACCESS_MASK;
+typedef ACCESS_MASK     REGSAM;
+typedef INT16           HFILE;
+typedef HANDLE32        HHOOK;
+typedef HANDLE32        HKEY;
+
+/* Pointers types. These are the same for emulator and library. */
+
+typedef CHAR           *LPSTR;
+typedef const CHAR     *LPCSTR;
+typedef WCHAR          *LPWSTR;
+typedef const WCHAR    *LPCWSTR;
+typedef BYTE           *LPBYTE;
+typedef WORD           *LPWORD;
+typedef DWORD          *LPDWORD;
+typedef LONG           *LPLONG;
+typedef VOID           *LPVOID;
+typedef const VOID     *LPCVOID;
+typedef INT16          *LPINT16;
+typedef UINT16         *LPUINT16;
+typedef INT32          *LPINT32;
+typedef UINT32         *LPUINT32;
+typedef HKEY           *LPHKEY;
+
+/* Special case: a segmented pointer is just a pointer in the library. */
+
+#ifdef WINELIB
 typedef void* SEGPTR;
-#else  /* WINELIB32 */
-typedef short INT;
-typedef unsigned short UINT;
-typedef char TCHAR;  /* TCHAR is just char in Win16 */
-typedef WORD NPVOID;
+#else  /* WINELIB */
 typedef DWORD SEGPTR;
-#endif  /* WINELIB32 */
+#endif /* WINELIB */
 
-typedef UINT16 HANDLE16;
-typedef UINT32 HANDLE32;
-typedef UINT HANDLE;
-typedef UINT WPARAM;
-typedef LONG LPARAM;
-typedef LONG LRESULT;
-typedef INT HFILE;
-typedef DWORD HHOOK;
-typedef char *LPSTR;
-typedef BYTE *LPBYTE;
-typedef const char *LPCSTR;
-typedef TCHAR *LPTSTR;
-typedef const TCHAR *LPCTSTR;
-typedef WCHAR *LPWSTR;
-typedef const WCHAR *LPCWSTR;
-typedef char *NPSTR;
-typedef INT *LPINT;
-typedef UINT *LPUINT;
-typedef WORD *LPWORD;
-typedef DWORD *LPDWORD;
-typedef LONG *LPLONG;
-typedef void *LPVOID;
-typedef const void *LPCVOID;
-typedef WORD CATCHBUF[9];
-typedef WORD *LPCATCHBUF;
-typedef DWORD ACCESS_MASK;
-typedef ACCESS_MASK REGSAM;
+/* Handle types that exist both in Win16 and Win32. */
 
-#define DECLARE_HANDLE(a) \
-    typedef HANDLE a; \
-    typedef HANDLE16 a##16; \
-    typedef HANDLE32 a##32;
-
+#define DECLARE_HANDLE(a)  typedef HANDLE16 a##16; typedef HANDLE32 a##32;
+DECLARE_HANDLE(HACCEL);
 DECLARE_HANDLE(HBITMAP);
 DECLARE_HANDLE(HBRUSH);
-DECLARE_HANDLE(HCLASS);
 DECLARE_HANDLE(HCURSOR);
 DECLARE_HANDLE(HDC);
 DECLARE_HANDLE(HDROP);
@@ -96,6 +131,10 @@
 DECLARE_HANDLE(HLOCAL);
 DECLARE_HANDLE(HMENU);
 DECLARE_HANDLE(HMETAFILE);
+DECLARE_HANDLE(HMIDI);
+DECLARE_HANDLE(HMIDIIN);
+DECLARE_HANDLE(HMIDIOUT);
+DECLARE_HANDLE(HMMIO);
 DECLARE_HANDLE(HMODULE);
 DECLARE_HANDLE(HPALETTE);
 DECLARE_HANDLE(HPEN);
@@ -103,69 +142,207 @@
 DECLARE_HANDLE(HRGN);
 DECLARE_HANDLE(HRSRC);
 DECLARE_HANDLE(HTASK);
+DECLARE_HANDLE(HWAVE);
+DECLARE_HANDLE(HWAVEIN);
+DECLARE_HANDLE(HWAVEOUT);
 DECLARE_HANDLE(HWND);
-DECLARE_HANDLE(LOCALHANDLE);
-#ifdef WINELIB32
-DECLARE_HANDLE(HKEY);
-#else
-typedef DWORD HKEY;
-#endif
-typedef HKEY* LPHKEY;
-typedef HGLOBAL GLOBALHANDLE;
+#undef DECLARE_HANDLE
+
+/* Callback function pointers types for Win16. */
 
 #ifdef WINELIB
-typedef long (*FARPROC)();
-typedef LRESULT (*WNDPROC)(HWND,UINT,WPARAM,LPARAM);
-typedef LRESULT (*WNDENUMPROC)(HWND,LPARAM);
+typedef LRESULT (*WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
+typedef LRESULT (*FARPROC16)();
+#else
+/* Function pointers are SEGPTR in Win16 */
+typedef SEGPTR FARPROC16;
+typedef SEGPTR WNDPROC16;
+#endif
+
+/* Callback function pointers types for Win32. */
+
+typedef LRESULT (*FARPROC32)();
+typedef LRESULT (*WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
+
+/* TCHAR data types definitions for Winelib. */
+/* These types are _not_ defined for the emulator, because they */
+/* depend on the UNICODE macro that only exists in user's code. */
+
+#ifdef WINELIB
+# if defined(WINELIB32) && defined(UNICODE)
+typedef WCHAR TCHAR;
+typedef LPWSTR LPTSTR;
+typedef LPCWSTR LPCTSTR;
+# else  /* WINELIB32 && UNICODE */
+typedef CHAR TCHAR;
+typedef LPSTR LPTSTR;
+typedef LPCSTR LPCTSTR;
+# endif /* WINELIB32 && UNICODE */
+#endif   /* WINELIB */
+
+/* Data types specific to the library. These do _not_ exist in the emulator. */
+
+DECL_WINELIB_TYPE(INT);
+DECL_WINELIB_TYPE(LPINT);
+DECL_WINELIB_TYPE(LPUINT);
+DECL_WINELIB_TYPE(UINT);
+DECL_WINELIB_TYPE(WPARAM);
+
+DECL_WINELIB_TYPE(HACCEL);
+DECL_WINELIB_TYPE(HANDLE);
+DECL_WINELIB_TYPE(HBITMAP);
+DECL_WINELIB_TYPE(HBRUSH);
+DECL_WINELIB_TYPE(HCURSOR);
+DECL_WINELIB_TYPE(HDC);
+DECL_WINELIB_TYPE(HDROP);
+DECL_WINELIB_TYPE(HDRVR);
+DECL_WINELIB_TYPE(HDWP);
+DECL_WINELIB_TYPE(HFONT);
+DECL_WINELIB_TYPE(HGDIOBJ);
+DECL_WINELIB_TYPE(HGLOBAL);
+DECL_WINELIB_TYPE(HICON);
+DECL_WINELIB_TYPE(HINSTANCE);
+DECL_WINELIB_TYPE(HLOCAL);
+DECL_WINELIB_TYPE(HMENU);
+DECL_WINELIB_TYPE(HMETAFILE);
+DECL_WINELIB_TYPE(HMIDI);
+DECL_WINELIB_TYPE(HMIDIIN);
+DECL_WINELIB_TYPE(HMIDIOUT);
+DECL_WINELIB_TYPE(HMMIO);
+DECL_WINELIB_TYPE(HMODULE);
+DECL_WINELIB_TYPE(HPALETTE);
+DECL_WINELIB_TYPE(HPEN);
+DECL_WINELIB_TYPE(HQUEUE);
+DECL_WINELIB_TYPE(HRGN);
+DECL_WINELIB_TYPE(HRSRC);
+DECL_WINELIB_TYPE(HTASK);
+DECL_WINELIB_TYPE(HWAVE);
+DECL_WINELIB_TYPE(HWAVEIN);
+DECL_WINELIB_TYPE(HWAVEOUT);
+DECL_WINELIB_TYPE(HWND);
+
+DECL_WINELIB_TYPE(FARPROC);
+DECL_WINELIB_TYPE(WNDPROC);
+
+/* Library data types defined as a transition aid for the emulator. */
+/* These should _not_ be used in the emulator and will be removed someday. */
+
+#ifndef NO_TRANSITION_TYPES
+
+#ifndef WINELIB
+typedef INT16 INT;
+typedef UINT16 UINT;
+typedef WPARAM16 WPARAM;
+typedef HANDLE16 HACCEL;
+typedef HANDLE16 HANDLE;
+typedef HANDLE16 HBITMAP;
+typedef HANDLE16 HBRUSH;
+typedef HANDLE16 HCURSOR;
+typedef HANDLE16 HDC;
+typedef HANDLE16 HDROP;
+typedef HANDLE16 HDRVR;
+typedef HANDLE16 HDWP;
+typedef HANDLE16 HFONT;
+typedef HANDLE16 HGDIOBJ;
+typedef HANDLE16 HGLOBAL;
+typedef HANDLE16 HICON;
+typedef HANDLE16 HINSTANCE;
+typedef HANDLE16 HMENU;
+typedef HANDLE16 HMETAFILE;
+typedef HANDLE16 HMIDI;
+typedef HANDLE16 HMIDIIN;
+typedef HANDLE16 HMIDIOUT;
+typedef HANDLE16 HMMIO;
+typedef HANDLE16 HMODULE;
+typedef HANDLE16 HPALETTE;
+typedef HANDLE16 HPEN;
+typedef HANDLE16 HQUEUE;
+typedef HANDLE16 HRGN;
+typedef HANDLE16 HRSRC;
+typedef HANDLE16 HTASK;
+typedef HANDLE16 HWAVE;
+typedef HANDLE16 HWAVEIN;
+typedef HANDLE16 HWAVEOUT;
+typedef HANDLE16 HWND;
+typedef FARPROC16 FARPROC;
+typedef WNDPROC16 WNDPROC;
+#endif  /* WINELIB */
+
+/* Callback function pointers types. */
+
+#ifdef WINELIB
+typedef LONG (*DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM);
+typedef int (*EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, int cch,int code);
 /*typedef int (*FONTENUMPROC)(const LOGFONT*,const TEXTMETRIC*,DWORD,LPARAM);*/
 typedef int (*FONTENUMPROC)(const void*,const void*,DWORD,LPARAM);
 typedef int (*GOBJENUMPROC)(LPVOID,LPARAM);
-typedef BOOL (*PROPENUMPROC)(HWND,LPCTSTR,HANDLE);
 /*typedef int (*MFENUMPROC)(HDC,HANDLETABLE*,METARECORD*,int,LPARAM);*/
 typedef int (*MFENUMPROC)(HDC,void*,void*,int,LPARAM);
+typedef BOOL (*PROPENUMPROC)(HWND,LPCTSTR,HANDLE);
+typedef LRESULT (*WNDENUMPROC)(HWND,LPARAM);
 #else
-typedef SEGPTR FARPROC;
-typedef SEGPTR WNDPROC;
-typedef SEGPTR WNDENUMPROC;
+typedef SEGPTR DRIVERPROC;
+typedef SEGPTR EDITWORDBREAKPROC;
 typedef SEGPTR FONTENUMPROC;
 typedef SEGPTR GOBJENUMPROC;
-typedef SEGPTR PROPENUMPROC;
 typedef SEGPTR MFENUMPROC;
+typedef SEGPTR PROPENUMPROC;
+typedef SEGPTR WNDENUMPROC;
 #endif
 typedef FARPROC DLGPROC;
 typedef FARPROC HOOKPROC;
 
-#define TRUE 1
+#endif  /* NO_TRANSITION_TYPES */
+
+/* Misc. constants. */
+
+#ifdef FALSE
+#undef FALSE
+#endif
 #define FALSE 0
-#define CW_USEDEFAULT ((INT)0x8000)
-#define FAR
-#define _far
+
+#ifdef TRUE
+#undef TRUE
+#endif
+#define TRUE  1
+
+#ifdef NULL
+#undef NULL
+#endif
+#define NULL  0
+
+/* Define some empty macros for compatibility with Windows code. */
+
+#ifdef WINELIB
+#define CALLBACK
 #define NEAR
-#define _near
+#define FAR
 #define PASCAL
+#define WINAPI
+#define _far
+#define _near
 #define _pascal
 #define __export
-#define VOID                void
-#define WINAPI              PASCAL
-#define CALLBACK            PASCAL
+#endif  /* WINELIB */
 
-#undef NULL
-#define NULL 0
+/* Macro for structure packing. */
 
 #ifdef WINELIB
 #define WINE_PACKED
 #else
 #define WINE_PACKED __attribute__ ((packed))
-#endif
+#endif  /* WINELIB */
 
-#define LOBYTE(w)           ((BYTE)(UINT)(w))
-#define HIBYTE(w)           ((BYTE)((UINT)(w) >> 8))
+/* Macros to split words and longs. */
+
+#define LOBYTE(w)           ((BYTE)(WORD)(w))
+#define HIBYTE(w)           ((BYTE)((WORD)(w) >> 8))
 
 #define LOWORD(l)           ((WORD)(DWORD)(l))
 #define HIWORD(l)           ((WORD)((DWORD)(l) >> 16))
 
-#define SLOWORD(l)           ((INT)(LONG)(l))
-#define SHIWORD(l)           ((INT)((LONG)(l) >> 16))
+#define SLOWORD(l)           ((INT16)(LONG)(l))
+#define SHIWORD(l)           ((INT16)((LONG)(l) >> 16))
 
 #define MAKELONG(low, high) ((LONG)(((WORD)(low)) | \
 				    (((DWORD)((WORD)(high))) << 16)))
@@ -173,6 +350,8 @@
 #define SELECTOROF(ptr)     (HIWORD(ptr))
 #define OFFSETOF(ptr)       (LOWORD(ptr))
 
+/* Macros to access unaligned or wrong-endian WORDs and DWORDs. */
+
 #if !defined(WINELIB) || defined(__i386__)
 #define PUT_WORD(ptr,w)   (*(WORD *)(ptr) = (w))
 #define GET_WORD(ptr)     (*(WORD *)(ptr))
@@ -189,13 +368,16 @@
                                    ((DWORD)GET_WORD((WORD *)(ptr)+1) << 16)))
 #endif  /* !WINELIB || __i386__ */
 
+/* MIN and MAX macros */
 
-#ifndef MAX
+#ifdef MAX
+#undef MAX
+#endif
 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
-#endif
 
-#ifndef MIN
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#ifdef MIN
+#undef MIN
 #endif
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
 
 #endif /* __WINE_WINTYPES_H */
diff --git a/include/winuser.h b/include/winuser.h
index 9ee274f..b8dcdb9 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -43,7 +43,7 @@
 typedef struct
 {
     UINT16      style;
-    WNDPROC     lpfnWndProc WINE_PACKED;
+    WNDPROC16   lpfnWndProc WINE_PACKED;
     INT16       cbClsExtra;
     INT16       cbWndExtra;
     HANDLE16    hInstance;
@@ -93,5 +93,55 @@
 DECL_WINELIB_TYPE_AW(WNDCLASSEX);
 DECL_WINELIB_TYPE_AW(LPWNDCLASSEX);
 
+#define CS_VREDRAW          0x0001
+#define CS_HREDRAW          0x0002
+#define CS_KEYCVTWINDOW     0x0004
+#define CS_DBLCLKS          0x0008
+#define CS_OWNDC            0x0020
+#define CS_CLASSDC          0x0040
+#define CS_PARENTDC         0x0080
+#define CS_NOKEYCVT         0x0100
+#define CS_NOCLOSE          0x0200
+#define CS_SAVEBITS         0x0800
+#define CS_BYTEALIGNCLIENT  0x1000
+#define CS_BYTEALIGNWINDOW  0x2000
+#define CS_GLOBALCLASS      0x4000
+
+  /* Offsets for GetClassLong() and GetClassWord() */
+#define GCL_MENUNAME        (-8)
+#define GCW_HBRBACKGROUND   (-10)
+#define GCL_HBRBACKGROUND   GCW_HBRBACKGROUND
+#define GCW_HCURSOR         (-12)
+#define GCL_HCURSOR         GCW_HCURSOR
+#define GCW_HICON           (-14)
+#define GCL_HICON           GCW_HICON
+#define GCW_HMODULE         (-16)
+#define GCL_HMODULE         GCW_HMODULE
+#define GCW_CBWNDEXTRA      (-18)
+#define GCL_CBWNDEXTRA      GCW_CBWNDEXTRA
+#define GCW_CBCLSEXTRA      (-20)
+#define GCL_CBCLSEXTRA      GCW_CBCLSEXTRA
+#define GCL_WNDPROC         (-24)
+#define GCW_STYLE           (-26)
+#define GCL_STYLE           GCW_STYLE
+#define GCW_ATOM            (-32)
+#define GCL_HICONSM         (-34)
+
+ATOM       RegisterClass16(const WNDCLASS16*);
+ATOM       RegisterClass32A(const WNDCLASS32A *);
+ATOM       RegisterClass32W(const WNDCLASS32W *);
+#define RegisterClass WINELIB_NAME_AW(RegisterClass)
+ATOM       RegisterClassEx32A(const WNDCLASSEX32A *);
+ATOM       RegisterClassEx32W(const WNDCLASSEX32W *);
+#define RegisterClassEx WINELIB_NAME_AW(RegisterClassEx)
+BOOL       UnregisterClass16(SEGPTR,HINSTANCE16);
+BOOL       UnregisterClass32A(LPCSTR,HINSTANCE32);
+BOOL       UnregisterClass32W(LPCWSTR,HINSTANCE32);
+#define UnregisterClass WINELIB_NAME_AW(UnregisterClass)
+
+BOOL       GetClassInfo(HANDLE,SEGPTR,WNDCLASS16 *);
+LONG       GetClassLong(HWND,short);
+int        GetClassName(HWND,LPSTR,short);
+LONG       SetClassLong(HWND,short,LONG);
 
 #endif  /* __WINE_WINUSER_H */
diff --git a/library/heap.c b/library/heap.c
index d942902..a3ac881 100644
--- a/library/heap.c
+++ b/library/heap.c
@@ -19,8 +19,6 @@
 /* Controls the blocks per handle table */
 #define MAXBLOCKS 1024
 
-static char Copyright [] = "Copyright (C) 1994 Miguel de Icaza";
-
 typedef struct handle_table {
     struct handle_table *next;
     void *blocks [MAXBLOCKS];
@@ -166,12 +164,12 @@
     return LocalUnlock (hMem);
 }
 
-WORD GlobalFlags (HANDLE hMem)
+WORD GlobalFlags16(HANDLE hMem)
 {
     return LocalFlags (hMem);
 }
 
-DWORD GlobalSize (HANDLE hMem)
+DWORD GlobalSize16(HANDLE hMem)
 {
     return LocalSize (hMem);
 }
@@ -184,7 +182,7 @@
 	return 0x01000000;	/* Should check the available core. */
 }
 
-HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
+HANDLE GlobalReAlloc16(HANDLE hMem, DWORD new_size, WORD flags)
 {
     if (!(flags & GMEM_MODIFY))
 	return LocalReAlloc (hMem, new_size, flags);
@@ -208,7 +206,9 @@
 
 #endif
 
-#else /* WINELIB16 */
+#endif /* WINELIB16 */
+
+#if 0
 
 typedef struct { DWORD Size; DWORD Padding[3]; } HeapData;
 
@@ -319,17 +319,17 @@
   return 0;
 }
 
-WORD GlobalFlags (HANDLE hMem)
+WORD GlobalFlags32(HANDLE hMem)
 {
   return LocalFlags (hMem);
 }
 
-DWORD GlobalSize (HANDLE hMem)
+DWORD GlobalSize32(HANDLE hMem)
 {
   return HEAP_Size (hMem);
 }
 
-HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
+HANDLE GlobalReAlloc32(HANDLE hMem, DWORD new_size, WORD flags)
 {
   if (!(flags & GMEM_MODIFY))
     return HEAP_ReAlloc (hMem, new_size, flags);
diff --git a/library/miscstubs.c b/library/miscstubs.c
index 407de96..1cee6cf 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -44,12 +44,13 @@
 
 WORD CallTo16_word_ ( FARPROC func, WORD arg ) { return func(arg); }
 
-void GlobalFreeAll(HANDLE owner)
+#if 0
+void GlobalFreeAll(HGLOBAL16 owner)
 {
   WINELIB_UNIMP("GlobalFreeAll()");
 }
 
-SEGPTR WIN16_GlobalLock(HGLOBAL h) 
+SEGPTR WIN16_GlobalLock16(HGLOBAL16 h) 
   { return (SEGPTR)h; }
 HLOCAL LOCAL_Free(WORD ds, HLOCAL handle) 
   { return LocalFree(handle); }
@@ -128,6 +129,7 @@
   fprintf(stderr,"JBP: GlobalHandle() ignored.\n");
   return 0;
 }
+#endif
 
 extern LRESULT ACTIVATEAPP_callback(HWND,UINT,WPARAM,LPARAM);
 extern LRESULT AboutDlgProc(HWND,UINT,WPARAM,LPARAM);
diff --git a/library/winmain.c b/library/winmain.c
index d1c0ac0..4508a34 100644
--- a/library/winmain.c
+++ b/library/winmain.c
@@ -8,7 +8,7 @@
 extern int MAIN_Init(void);
 extern BOOL WIDGETS_Init(void);
 extern BOOL WIN_CreateDesktopWindow(void);
-extern int PASCAL WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
+extern int WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
 extern void TASK_Reschedule(void);
 extern int USER_InitApp(HINSTANCE);
 
diff --git a/libtest/hello.c b/libtest/hello.c
index 4285ac1..7de4fb5 100644
--- a/libtest/hello.c
+++ b/libtest/hello.c
@@ -42,6 +42,8 @@
     HWND     wnd;
     MSG      msg;
     WNDCLASS class;
+    char className[] = "class";  /* To make sure className >= 0x10000 */
+    char winName[] = "Test app";
 
     if (!prev){
 	class.style = CS_HREDRAW | CS_VREDRAW;
@@ -53,12 +55,12 @@
 	class.hCursor    = LoadCursor (0, IDC_ARROW);
 	class.hbrBackground = GetStockObject (WHITE_BRUSH);
 	class.lpszMenuName = NULL;
-	class.lpszClassName = (SEGPTR)"class";
+	class.lpszClassName = (SEGPTR)className;
     }
     if (!RegisterClass (&class))
 	return FALSE;
 
-    wnd = CreateWindow ("class", "Test app", WS_OVERLAPPEDWINDOW,
+    wnd = CreateWindow (className, winName, WS_OVERLAPPEDWINDOW,
 			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
 			0, inst, 0);
     ShowWindow (wnd, show);
diff --git a/libtest/hello3.c b/libtest/hello3.c
index fe532cb..588c627 100644
--- a/libtest/hello3.c
+++ b/libtest/hello3.c
@@ -69,6 +69,8 @@
     HWND     wnd;
     MSG      msg;
     WNDCLASS class;
+    char className[] = "class";  /* To make sure className >= 0x10000 */
+    char winName[] = "Test app";
 
     if (!prev){
 	class.style = CS_HREDRAW | CS_VREDRAW;
@@ -80,12 +82,12 @@
 	class.hCursor    = LoadCursor (0, IDC_ARROW);
 	class.hbrBackground = GetStockObject (WHITE_BRUSH);
 	class.lpszMenuName = 0;
-	class.lpszClassName = (SEGPTR)"class";
+	class.lpszClassName = (SEGPTR)className;
     }
     if (!RegisterClass (&class))
 	return FALSE;
 
-    wnd = CreateWindow ("class", "Test app", WS_OVERLAPPEDWINDOW,
+    wnd = CreateWindow (className, winName, WS_OVERLAPPEDWINDOW,
 			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
 			LoadMenu(inst,"MAIN"), inst, 0);
     ShowWindow (wnd, show);
diff --git a/libtest/hello4.c b/libtest/hello4.c
index 9e8f800..964c521 100644
--- a/libtest/hello4.c
+++ b/libtest/hello4.c
@@ -78,6 +78,9 @@
     HWND     wnd,wnd2;
     MSG      msg;
     WNDCLASS class;
+    char className[] = "class";  /* To make sure className >= 0x10000 */
+    char class2Name[] = "class2";
+    char winName[] = "Test app";
 
     if (!prev){
 	class.style = CS_HREDRAW | CS_VREDRAW;
@@ -89,23 +92,23 @@
 	class.hCursor    = LoadCursor (0, IDC_ARROW);
 	class.hbrBackground = GetStockObject (WHITE_BRUSH);
 	class.lpszMenuName = NULL;
-	class.lpszClassName = (SEGPTR)"class";
+	class.lpszClassName = (SEGPTR)className;
         if (!RegisterClass (&class))
 	    return FALSE;
     }
 
-    wnd = CreateWindow ("class", "Test app", WS_OVERLAPPEDWINDOW,
+    wnd = CreateWindow (className, winName, WS_OVERLAPPEDWINDOW,
 			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
 			0, inst, 0);
 
     if (!prev){
         class.lpfnWndProc = WndProc2;
-	class.lpszClassName = (SEGPTR)"class2";
+	class.lpszClassName = class2Name;
         if (!RegisterClass (&class))
 	    return FALSE;
     }
 
-    wnd2= CreateWindow ("class2","Test app", WS_BORDER | WS_CHILD, 
+    wnd2= CreateWindow (class2Name,"Test app", WS_BORDER | WS_CHILD, 
                         50, 50, 350, 50, wnd, 0, inst, 0);
 
     ShowWindow (wnd, show);
diff --git a/libtest/new.c b/libtest/new.c
index 8dfabce..67f68f5 100644
--- a/libtest/new.c
+++ b/libtest/new.c
@@ -9,7 +9,7 @@
 int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
 		    LPSTR lpszCmdParam, int nCmdShow)
     {
-    static char szAppName[] = "ClassLook" ;
+    char szAppName[] = "ClassLook" ;
     HWND        hwnd ;
     MSG		msg ;
     WNDCLASS    wndclass ;
@@ -32,7 +32,7 @@
 	 }
 
     hwnd = CreateWindow (szAppName,	/* window class name */
-		  "ClassLook",		/* window caption */
+		  szAppName,		/* window caption */
 		  WS_OVERLAPPEDWINDOW,	/* window style */
 		  CW_USEDEFAULT,	/* initial x position */
 		  CW_USEDEFAULT,	/* initial y position */
@@ -60,6 +60,7 @@
     PAINTSTRUCT	ps ;
     RECT	rect ;
     WNDCLASS    wndclass ;
+    char clsName[] = "SecondClass";
 
     static HWND	hChild;
 
@@ -75,11 +76,11 @@
     	     wndclass.hCursor		= LoadCursor (NULL, IDC_CROSS) ;
     	     wndclass.hbrBackground	= GetStockObject (LTGRAY_BRUSH) ;
     	     wndclass.lpszMenuName	= NULL ;
-    	     wndclass.lpszClassName	= "SecondClass" ;
+    	     wndclass.lpszClassName	= clsName;
 
 	     RegisterClass (&wndclass);
               
-             hChild = CreateWindow("SecondClass","Child Window",
+             hChild = CreateWindow(clsName,"Child Window",
                  WS_CHILD | WS_VISIBLE | WS_BORDER,
                  10, 10, 580, 380, hwnd, NULL, ghInstance, NULL);
              ShowWindow(hChild, SW_SHOW);
@@ -106,7 +107,7 @@
     HDC			hDC;
     PAINTSTRUCT		ps;
     WNDCLASS		wndClass;
-    char*		classes[]={"EDIT","BUTTON","LISTBOX","STATIC","SCROLLBAR","COMBOBOX","COMBOLBOX", NULL};
+    char		*classes[]={"EDIT","BUTTON","LISTBOX","STATIC","SCROLLBAR","COMBOBOX","COMBOLBOX", NULL};
     char**		curr;
     char		buf[256];
     RECT	rect ;
diff --git a/libtest/rolex.c b/libtest/rolex.c
index 2f5212c..f7aadd0 100644
--- a/libtest/rolex.c
+++ b/libtest/rolex.c
@@ -15,8 +15,8 @@
 #include <string.h>
 #include "windows.h"
 
-char* AppName = "Rolex";
-char* WindowName = "Rolex";
+char AppName[] = "Rolex";
+char WindowName[] = "Rolex";
 int WindowWidth = 100;
 int WindowHeight = 121;
 COLORREF FaceColor = RGB(192,192,192);
diff --git a/loader/builtin.c b/loader/builtin.c
index a2f074d..33ea613 100644
--- a/loader/builtin.c
+++ b/loader/builtin.c
@@ -96,13 +96,16 @@
 extern const DLL_DESCRIPTOR ADVAPI32_Descriptor;
 extern const DLL_DESCRIPTOR COMCTL32_Descriptor;
 extern const DLL_DESCRIPTOR COMDLG32_Descriptor;
+extern const DLL_DESCRIPTOR CRTDLL_Descriptor;
 extern const DLL_DESCRIPTOR OLE32_Descriptor;
 extern const DLL_DESCRIPTOR GDI32_Descriptor;
 extern const DLL_DESCRIPTOR KERNEL32_Descriptor;
+extern const DLL_DESCRIPTOR NTDLL_Descriptor;
 extern const DLL_DESCRIPTOR SHELL32_Descriptor;
 extern const DLL_DESCRIPTOR USER32_Descriptor;
 extern const DLL_DESCRIPTOR WPROCS32_Descriptor;
 extern const DLL_DESCRIPTOR WINSPOOL_Descriptor;
+extern const DLL_DESCRIPTOR WSOCK32_Descriptor;
 
 /* Table of all built-in DLLs */
 
@@ -141,13 +144,16 @@
     { &ADVAPI32_Descriptor, 0 },
     { &COMCTL32_Descriptor, 0 },
     { &COMDLG32_Descriptor, 0 },
+    { &CRTDLL_Descriptor, 0 },
     { &OLE32_Descriptor,    0 },
     { &GDI32_Descriptor,    0 },
     { &KERNEL32_Descriptor, DLL_FLAG_ALWAYS_USED },
+    { &NTDLL_Descriptor,  0 },
     { &SHELL32_Descriptor,  0 },
     { &USER32_Descriptor,   0 },
     { &WPROCS32_Descriptor, DLL_FLAG_ALWAYS_USED },
     { &WINSPOOL_Descriptor, 0 },
+    { &WSOCK32_Descriptor, 0 },
     /* Last entry */
     { NULL, 0 }
 };
@@ -214,7 +220,7 @@
 
     dprintf_module( stddeb, "Built-in %s: hmodule=%04x\n",
                     table->descr->name, hModule );
-    pModule = (NE_MODULE *)GlobalLock( hModule );
+    pModule = (NE_MODULE *)GlobalLock16( hModule );
     pModule->self = hModule;
 
     if (pModule->flags & NE_FFLAGS_WIN32)
@@ -243,7 +249,7 @@
         pSegTable->selector = GLOBAL_Alloc( GMEM_FIXED, minsize,
                                             hModule, FALSE, FALSE, FALSE );
         if (!pSegTable->selector) return 0;
-        if (pSegTable->minsize) memcpy( GlobalLock( pSegTable->selector ),
+        if (pSegTable->minsize) memcpy( GlobalLock16( pSegTable->selector ),
                                         descr->data_start, pSegTable->minsize);
         if (pModule->heap_size)
             LocalInit( pSegTable->selector, pSegTable->minsize, minsize );
@@ -266,7 +272,7 @@
     register BYTE *p;
     NE_MODULE *pModule;
 
-    if (!(pModule = MODULE_GetPtr( FarGetOwner( GlobalHandle(cs) ))))
+    if (!(pModule = MODULE_GetPtr( FarGetOwner( GlobalHandle16(cs) ))))
         return NULL;
 
     /* Search for the ordinal */
diff --git a/loader/main.c b/loader/main.c
index 334ec82..0a2d764 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -34,6 +34,7 @@
 #include "options.h"
 #include "spy.h"
 #include "task.h"
+#include "user.h"
 #include "dce.h"
 #include "pe_image.h"
 #include "stddebug.h"
@@ -61,7 +62,13 @@
     /* Initialize message spying */
     if (!SPY_Init()) return 0;
 
-#ifndef WINELIB
+#ifdef WINELIB
+    /* Create USER and GDI heap */
+    USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 0x10000 );
+    LocalInit( USER_HeapSel, 0, 0xffff );
+    GDI_HeapSel  = GlobalAlloc16( GMEM_FIXED, GDI_HEAP_SIZE );
+    LocalInit( GDI_HeapSel, 0, GDI_HEAP_SIZE-1 );
+#else
       /* Initialize relay code */
     if (!RELAY_Init()) return 0;
 
diff --git a/loader/module.c b/loader/module.c
index a3f4615..920313f 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -43,7 +43,7 @@
  */
 NE_MODULE *MODULE_GetPtr( HMODULE hModule )
 {
-    NE_MODULE *pModule = (NE_MODULE *)GlobalLock( hModule );
+    NE_MODULE *pModule = (NE_MODULE *)GlobalLock16( hModule );
     if (!pModule || (pModule->magic != NE_SIGNATURE) ||
         (pModule->self != hModule)) return NULL;
     return pModule;
@@ -177,7 +177,7 @@
     printf( "\nNon-resident names table:\n" );
     if (pModule->nrname_handle)
     {
-        pstr = (char *)GlobalLock( pModule->nrname_handle );
+        pstr = (char *)GlobalLock16( pModule->nrname_handle );
         while (*pstr)
         {
             printf( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
@@ -275,11 +275,11 @@
 DWORD MODULE_AllocateSegment(WORD wFlags, WORD wSize, WORD wElem)
 {
     WORD size = wSize << wElem;
-    HANDLE hMem = GlobalAlloc( MODULE_Ne2MemFlags(wFlags), size);
-#ifdef WINELIB32
-    return (DWORD)GlobalLock(hMem);
+    HANDLE hMem = GlobalAlloc16( MODULE_Ne2MemFlags(wFlags), size);
+#ifdef WINELIB
+    return (DWORD)GlobalLock16(hMem);
 #else
-    WORD selector = HIWORD(GlobalLock(hMem));
+    WORD selector = HIWORD(WIN16_GlobalLock16(hMem));
     return MAKELONG(hMem, selector);
 #endif
 }
@@ -421,10 +421,10 @@
              /* entry table length */
            ne_header.entry_tab_length;
 
-    hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
+    hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
     if (!hModule) return (HMODULE)11;  /* invalid exe */
     FarSetOwner( hModule, hModule );
-    pModule = (NE_MODULE *)GlobalLock( hModule );
+    pModule = (NE_MODULE *)GlobalLock16( hModule );
     memcpy( pModule, &ne_header, sizeof(ne_header) );
     pModule->count = 0;
     pModule->pe_module = NULL;
@@ -485,7 +485,7 @@
     }
     else
     {
-        GlobalFree( hModule );
+        GlobalFree16( hModule );
         return (HMODULE)11;  /* invalid exe */
     }
 
@@ -508,7 +508,7 @@
                ne_header.moduleref_tab_offset - ne_header.rname_tab_offset,
                pData ))
     {
-        GlobalFree( hModule );
+        GlobalFree16( hModule );
         return (HMODULE)11;  /* invalid exe */
     }
     pData += ne_header.moduleref_tab_offset - ne_header.rname_tab_offset;
@@ -532,7 +532,7 @@
                ne_header.entry_tab_offset - ne_header.iname_tab_offset,
                pData ))
     {
-        GlobalFree( hModule );
+        GlobalFree16( hModule );
         return (HMODULE)11;  /* invalid exe */
     }
     pData += ne_header.entry_tab_offset - ne_header.iname_tab_offset;
@@ -544,7 +544,7 @@
                ne_header.entry_tab_length,
                pData ))
     {
-        GlobalFree( hModule );
+        GlobalFree16( hModule );
         return (HMODULE)11;  /* invalid exe */
     }
     pData += ne_header.entry_tab_length;
@@ -557,16 +557,16 @@
                                                hModule, FALSE, FALSE, FALSE );
         if (!pModule->nrname_handle)
         {
-            GlobalFree( hModule );
+            GlobalFree16( hModule );
             return (HMODULE)11;  /* invalid exe */
         }
-        buffer = GlobalLock( pModule->nrname_handle );
+        buffer = GlobalLock16( pModule->nrname_handle );
         _llseek( hFile, ne_header.nrname_tab_offset, SEEK_SET );
         if (FILE_Read( hFile, buffer, ne_header.nrname_tab_length )
               != ne_header.nrname_tab_length)
         {
-            GlobalFree( pModule->nrname_handle );
-            GlobalFree( hModule );
+            GlobalFree16( pModule->nrname_handle );
+            GlobalFree16( hModule );
             return (HMODULE)11;  /* invalid exe */
         }
     }
@@ -581,8 +581,8 @@
                                     hModule, FALSE, FALSE, FALSE );
         if (!pModule->dlls_to_init)
         {
-            if (pModule->nrname_handle) GlobalFree( pModule->nrname_handle );
-            GlobalFree( hModule );
+            if (pModule->nrname_handle) GlobalFree16( pModule->nrname_handle );
+            GlobalFree16( hModule );
             return (HMODULE)11;  /* invalid exe */
         }
     }
@@ -640,7 +640,7 @@
       /* Now search the non-resident names table */
 
     if (!pModule->nrname_handle) return 0;  /* No non-resident table */
-    cpnt = (char *)GlobalLock( pModule->nrname_handle );
+    cpnt = (char *)GlobalLock16( pModule->nrname_handle );
 
       /* Skip the first entry (module description string) */
     cpnt += *cpnt + 1 + sizeof(WORD);
@@ -704,7 +704,7 @@
 
     if (sel == 0xfe) sel = 0xffff;  /* constant entry */
     else sel = (WORD)(DWORD)NE_SEG_TABLE(pModule)[sel-1].selector;
-    return (SEGPTR)MAKELONG( offset, sel );
+    return PTR_SEG_OFF_TO_SEGPTR( sel, offset );
 }
 
 
@@ -893,7 +893,7 @@
     pSegment = NE_SEG_TABLE( pModule );
     for (i = 1; i <= pModule->seg_count; i++, pSegment++)
     {
-        GlobalFree( pSegment->selector );
+        GlobalFree16( pSegment->selector );
     }
 
       /* Free the referenced modules */
@@ -906,9 +906,9 @@
 
       /* Free the module storage */
 
-    if (pModule->nrname_handle) GlobalFree( pModule->nrname_handle );
-    if (pModule->dlls_to_init) GlobalFree( pModule->dlls_to_init );
-    GlobalFree( hModule );
+    if (pModule->nrname_handle) GlobalFree16( pModule->nrname_handle );
+    if (pModule->dlls_to_init) GlobalFree16( pModule->dlls_to_init );
+    GlobalFree16( hModule );
 
       /* Remove module from cache */
 
@@ -978,7 +978,7 @@
           /* Load the referenced DLLs */
 
         pModRef = (WORD *)((char *)pModule + pModule->modref_table);
-        pDLLs = (WORD *)GlobalLock( pModule->dlls_to_init );
+        pDLLs = (WORD *)GlobalLock16( pModule->dlls_to_init );
         for (i = 0; i < pModule->modref_count; i++, pModRef++)
         {
             char buffer[256];
@@ -1059,8 +1059,8 @@
 
 		  /* Create the 32-bit stack frame */
 		  
-		  *(DWORD *)GlobalLock(hInitialStack32) = 0xDEADBEEF;
-		  stack32Top = (char*)GlobalLock(hInitialStack32) + 
+		  *(DWORD *)GlobalLock16(hInitialStack32) = 0xDEADBEEF;
+		  stack32Top = (char*)GlobalLock16(hInitialStack32) + 
 		    0x10000;
 		  frame32 = (STACK32FRAME *)stack32Top - 1;
 		  frame32->saved_esp = (DWORD)stack32Top;
@@ -1073,7 +1073,7 @@
 		  frame32->retaddr = 0;
 		  frame32->codeselector = WINE_CODE_SELECTOR;
 		  /* pTask->esp = (DWORD)frame32; */
-		  IF1632_Stack32_base = WIN16_GlobalLock(hInitialStack32);
+		  IF1632_Stack32_base = WIN16_GlobalLock16(hInitialStack32);
 
 		}
                 /* FIXME: we probably need a DOS handle here */
@@ -1086,8 +1086,7 @@
 		IF1632_Saved16_sp = oldsp;
 		for (i = 2; i <= pModule->seg_count; i++) NE_LoadSegment( hModule, i );
 		if (hInitialStack32){
-		  GlobalUnlock (hInitialStack32);
-		  GlobalFree (hInitialStack32);
+		  GlobalFree16(hInitialStack32);
 		  IF1632_Stack32_base = hInitialStack32 = 0;
 		}
 	} 
@@ -1116,8 +1115,8 @@
         pModule->count++;
     }
 #else
-    hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(NE_MODULE) );
-    pModule = (NE_MODULE *)GlobalLock( hModule );
+    hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(NE_MODULE));
+    pModule = (NE_MODULE *)GlobalLock16( hModule );
     pModule->count = 1;
     pModule->magic = NE_SIGNATURE;
     pModule->self = hModule;
@@ -1249,24 +1248,24 @@
 HANDLE WinExec( LPSTR lpCmdLine, WORD nCmdShow )
 {
     LOADPARAMS params;
-    HLOCAL cmdShowHandle, cmdLineHandle;
+    HGLOBAL16 cmdShowHandle, cmdLineHandle;
     HANDLE handle;
     WORD *cmdShowPtr;
     char *p, *cmdline, filename[256];
     static int use_load_module = 1;
 
-    if (!(cmdShowHandle = GlobalAlloc( 0, 2 * sizeof(WORD) ))) return 0;
-    if (!(cmdLineHandle = GlobalAlloc( 0, 256 ))) return 0;
+    if (!(cmdShowHandle = GlobalAlloc16( 0, 2 * sizeof(WORD) ))) return 0;
+    if (!(cmdLineHandle = GlobalAlloc16( 0, 256 ))) return 0;
 
       /* Store nCmdShow */
 
-    cmdShowPtr = (WORD *)GlobalLock( cmdShowHandle );
+    cmdShowPtr = (WORD *)GlobalLock16( cmdShowHandle );
     cmdShowPtr[0] = 2;
     cmdShowPtr[1] = nCmdShow;
 
       /* Build the filename and command-line */
 
-    cmdline = (char *)GlobalLock( cmdLineHandle );
+    cmdline = (char *)GlobalLock16( cmdLineHandle );
     lstrcpyn( filename, lpCmdLine, sizeof(filename) - 4 /* for extension */ );
     for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++);
     if (*p) lstrcpyn( cmdline, p + 1, 128 );
@@ -1284,8 +1283,8 @@
 #else
 	params.hEnvironment = (HANDLE)SELECTOROF( GetDOSEnvironment() );
 #endif  /* WINELIB */
-	params.cmdLine  = (SEGPTR)WIN16_GlobalLock( cmdLineHandle );
-	params.showCmd  = (SEGPTR)WIN16_GlobalLock( cmdShowHandle );
+	params.cmdLine  = (SEGPTR)WIN16_GlobalLock16( cmdLineHandle );
+	params.showCmd  = (SEGPTR)WIN16_GlobalLock16( cmdShowHandle );
 	params.reserved = 0;
 	handle = LoadModule( filename, &params );
 	if (handle == 2)  /* file not found */
@@ -1360,8 +1359,8 @@
 	}
     }
 
-    GlobalFree( cmdShowHandle );
-    GlobalFree( cmdLineHandle );
+    GlobalFree16( cmdShowHandle );
+    GlobalFree16( cmdLineHandle );
 
 #if 0
     if (handle < (HANDLE)32)	/* Error? */
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 447b500..8fb2030 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -60,7 +60,7 @@
                     segnum, pSeg->selector );
     lseek( fd, pSeg->filepos << pModule->alignment, SEEK_SET );
     size = pSeg->size ? pSeg->size : 0x10000;
-    mem = GlobalLock(pSeg->selector);
+    mem = GlobalLock16(pSeg->selector);
     if (pModule->flags & NE_FFLAGS_SELFLOAD && segnum > 1) {	
 #ifndef WINELIB
  	/* Implement self loading segments */
@@ -231,7 +231,7 @@
 	    }
 	    else
 	    {
-                address = MAKELONG( rep->target2, pSegTable[rep->target1-1].selector );
+                address = PTR_SEG_OFF_TO_SEGPTR( pSegTable[rep->target1-1].selector, rep->target2 );
 	    }
 	    
 	    dprintf_fixup(stddeb,"%d: %04x:%04x\n", 
@@ -517,12 +517,12 @@
     {
 	HANDLE to_init = pModule->dlls_to_init;
 	pModule->dlls_to_init = 0;
-        for (pDLL = (HMODULE *)GlobalLock( to_init ); *pDLL; pDLL++)
+        for (pDLL = (HMODULE *)GlobalLock16( to_init ); *pDLL; pDLL++)
         {
             NE_InitializeDLLs( *pDLL );
             NE_InitDLL( *pDLL );
         }
-        GlobalFree( to_init );
+        GlobalFree16( to_init );
     }
     NE_InitDLL( hModule );
 }
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index caee5f8..bf88022 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -298,7 +298,7 @@
     pNameInfo->handle = NE_AllocResource( hModule, hRsrc, 0 );
     pNameInfo->usage = 1;
     lseek( fd, (int)pNameInfo->offset << sizeShift, SEEK_SET );
-    read( fd, GlobalLock( pNameInfo->handle ),
+    read( fd, GlobalLock16( pNameInfo->handle ),
           (int)pNameInfo->length << sizeShift );
     return pNameInfo->handle;
 }
@@ -311,7 +311,7 @@
 {
     /* May need to reload the resource if discarded */
 
-    return (SEGPTR)WIN16_GlobalLock( handle );
+    return (SEGPTR)WIN16_GlobalLock16( handle );
 }
 
 
@@ -337,7 +337,7 @@
                 if (pNameInfo->usage > 0) pNameInfo->usage--;
                 if (pNameInfo->usage == 0)
                 {
-                    GlobalFree( pNameInfo->handle );
+                    GlobalFree16( pNameInfo->handle );
                     pNameInfo->handle = 0;
                 }
                 return TRUE;
diff --git a/loader/pe_image.c b/loader/pe_image.c
index d16417a..461a074 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -34,8 +34,6 @@
 #include "debug.h"
 #include "xmalloc.h"
 
-static HANDLE32 ProcessHeap;  /* FIXME: should be in process database */
-
 void my_wcstombs(char * result, u_short * source, int len)
 {
   while(len--) {
@@ -164,10 +162,10 @@
   	i++;
 
   /* Now, allocate memory for dlls_to_init */
-  ne_mod = GlobalLock(hModule);
+  ne_mod = GlobalLock16(hModule);
   ne_mod->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,(i+1) * sizeof(HMODULE),
                                       hModule, FALSE, FALSE, FALSE );
-  mod_ptr = GlobalLock(ne_mod->dlls_to_init);
+  mod_ptr = GlobalLock16(ne_mod->dlls_to_init);
   /* load the modules and put their handles into the list */
   for(i=0,pe_imp = pe->pe_import;pe_imp->ModuleName;pe_imp++)
   {
@@ -207,16 +205,17 @@
 		dprintf_win32(stddeb,"--- Ordinal %s,%d\n", Module, ordinal);
 		*thunk_list = WIN32_GetProcAddress(MODULE_FindModule(Module),
 			ordinal);
+	  	if(!*thunk_list)
+	  	{
+	  		fprintf(stderr,"No implementation for %s.%d\n",Module, 
+				ordinal);
+			fixup_failed=1;
+	  	}
 	  }else{ /* import by name */
 	  dprintf_win32(stddeb, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
 #ifndef WINELIB /* FIXME: JBP: Should this happen in libwine.a? */
 	  	*thunk_list = WIN32_GetProcAddress(MODULE_FindModule(Module),
 				pe_name->Name);
-
-#else
-	  fprintf(stderr,"JBP: Call to RELAY32_GetEntryPoint being ignored.\n");
-#endif
-		}
 	  if(!*thunk_list)
 	  {
 	  	fprintf(stderr,"No implementation for %s.%d(%s)\n",Module, 
@@ -224,6 +223,11 @@
 		fixup_failed=1;
 	  }
 
+#else
+	  fprintf(stderr,"JBP: Call to RELAY32_GetEntryPoint being ignored.\n");
+#endif
+		}
+
 	  import_list++;
 	  thunk_list++;
 	}
@@ -552,12 +556,12 @@
                /* several empty tables */
                8;
 
-	hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
+	hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
 	if (!hModule) return (HINSTANCE)11;  /* invalid exe */
 
 	FarSetOwner( hModule, hModule );
 	
-	pModule = (NE_MODULE*)GlobalLock(hModule);
+	pModule = (NE_MODULE*)GlobalLock16(hModule);
 
 	/* Set all used entries */
 	pModule->magic=NE_SIGNATURE;
@@ -623,7 +627,6 @@
 	if ((pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL)) {
 /*            PE_InitDLL(hModule); */
         } else {
-            ProcessHeap = HeapCreate( 0, 0x10000, 0 );
             TASK_CreateTask(hModule,hInstance,0,
 		params->hEnvironment,(LPSTR)PTR_SEG_TO_LIN(params->cmdLine),
 		*((WORD*)PTR_SEG_TO_LIN(params->showCmd)+1));
@@ -632,11 +635,6 @@
 	return hInstance;
 }
 
-HANDLE32 GetProcessHeap(void)
-{
-    return ProcessHeap;
-}
-
 int USER_InitApp(HINSTANCE hInstance);
 void PE_InitTEB(int hTEB);
 
@@ -651,7 +649,7 @@
     hModule = GetExePtr( GetCurrentTask() );
     pModule = MODULE_GetPtr( hModule );
     USER_InitApp( hModule );
-    fs=(int)GlobalAlloc(GHND,0x10000);
+    fs=(int)GlobalAlloc16(GHND,0x10000);
     PE_InitTEB(fs);
     __asm__ __volatile__("movw %w0,%%fs"::"r" (fs));
     CallTaskStart32( (FARPROC)(pModule->pe_module->load_addr + 
@@ -706,9 +704,9 @@
     TDB *pTask;
     TEB *pTEB;
 
-    pTask = (TDB *)(GlobalLock(GetCurrentTask() & 0xffff));
+    pTask = (TDB *)(GlobalLock16(GetCurrentTask() & 0xffff));
     pTEB = (TEB *)(PTR_SEG_OFF_TO_LIN(hTEB, 0));
-    pTEB->stack = (void *)(GlobalLock(pTask->hStack32));
+    pTEB->stack = (void *)(GlobalLock16(pTask->hStack32));
     pTEB->Except = (void *)(-1); 
     pTEB->TEBDSAlias = pTEB;
     pTEB->taskid = getpid();
@@ -723,12 +721,12 @@
 	{
 		HANDLE to_init = pModule->dlls_to_init;
 		pModule->dlls_to_init = 0;
-		for (pDLL = (HMODULE *)GlobalLock( to_init ); *pDLL; pDLL++)
+		for (pDLL = (HMODULE *)GlobalLock16( to_init ); *pDLL; pDLL++)
 		{
 			PE_InitializeDLLs( *pDLL );
 			PE_InitDLL( *pDLL );
 		}
-		GlobalFree( to_init );
+		GlobalFree16( to_init );
 	}
 	PE_InitDLL( hModule );
 }
diff --git a/loader/resource.c b/loader/resource.c
index 5c5ec93..6ebfd69 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -279,9 +279,9 @@
 
     lp = (BYTE *)LockResource(rsc_mem);
     n = SizeofResource( instance, hRsrc ) / sizeof(ACCELENTRY);
-    hAccel = GlobalAlloc(GMEM_MOVEABLE, 
+    hAccel = GlobalAlloc16(GMEM_MOVEABLE, 
     	sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
-    lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
+    lpAccelTbl = (LPACCELHEADER)GlobalLock16(hAccel);
     lpAccelTbl->wCount = 0;
     for (i = 0; i < n; i++) {
 	lpAccelTbl->tbl[i].type = *(lp++);
@@ -296,7 +296,7 @@
 		lpAccelTbl->tbl[i].type);
 	lpAccelTbl->wCount++;
  	}
-    GlobalUnlock(hAccel);
+    GlobalUnlock16(hAccel);
     FreeResource( rsc_mem );
     return hAccel;
 }
@@ -318,7 +318,7 @@
 
     dprintf_accel(stddeb, "TranslateAccelerators hAccel=%04x !\n", hAccel);
 
-    lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
+    lpAccelTbl = (LPACCELHEADER)GlobalLock16(hAccel);
     for (i = 0; i < lpAccelTbl->wCount; i++) {
 	if(lpAccelTbl->tbl[i].type & VIRTKEY_ACCEL) {
 	    if(msg->wParam == lpAccelTbl->tbl[i].wEvent &&
@@ -332,7 +332,7 @@
 			    (SHIFT_ACCEL | CONTROL_ACCEL | ALT_ACCEL))) {
 		    SendMessage(hWnd, WM_COMMAND, lpAccelTbl->tbl[i].wIDval,
 				0x00010000L);
-		    GlobalUnlock(hAccel);
+		    GlobalUnlock16(hAccel);
 		    return 1;
 	        }
 		if (msg->message == WM_KEYUP || msg->message == WM_SYSKEYUP)
@@ -343,12 +343,12 @@
 	    if (msg->wParam == lpAccelTbl->tbl[i].wEvent &&
 		msg->message == WM_CHAR) {
 		SendMessage(hWnd, WM_COMMAND, lpAccelTbl->tbl[i].wIDval, 0x00010000L);
-		GlobalUnlock(hAccel);
+		GlobalUnlock16(hAccel);
 		return 1;
 		}
 	    }
 	}
-    GlobalUnlock(hAccel);
+    GlobalUnlock16(hAccel);
     return 0;
 }
 
diff --git a/loader/task.c b/loader/task.c
index bab6794..52be7a7 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -74,7 +74,7 @@
  */
 HTASK TASK_GetNextTask( HTASK hTask )
 {
-    TDB* pTask = (TDB*)GlobalLock(hTask);
+    TDB* pTask = (TDB*)GlobalLock16(hTask);
 
     if (pTask->hNext) return pTask->hNext;
     return (hFirstTask != hTask) ? hFirstTask : 0; 
@@ -141,8 +141,8 @@
 
     /* Now allocate the environment */
 
-    if (!(handle = GlobalAlloc( GMEM_FIXED, size ))) return 0;
-    p = (char *)GlobalLock( handle );
+    if (!(handle = GlobalAlloc16( GMEM_FIXED, size ))) return 0;
+    p = (char *)GlobalLock16( handle );
 
     /* And fill it with the Unix environment */
 
@@ -181,7 +181,7 @@
 
     /* Display it */
 
-    p = (char *) GlobalLock( handle );
+    p = (char *) GlobalLock16( handle );
     dprintf_task(stddeb, "Master DOS environment at %p\n", p);
     for (; *p; p += strlen(p) + 1) dprintf_task(stddeb, "    %s\n", p);
     dprintf_task( stddeb, "Progname: %s\n", p+3 );
@@ -198,11 +198,11 @@
     HTASK *prevTask;
     TDB *pTask;
 
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return;
     prevTask = &hFirstTask;
     while (*prevTask)
     {
-        TDB *prevTaskPtr = (TDB *)GlobalLock( *prevTask );
+        TDB *prevTaskPtr = (TDB *)GlobalLock16( *prevTask );
         if (prevTaskPtr->priority >= pTask->priority) break;
         prevTask = &prevTaskPtr->hNext;
     }
@@ -223,12 +223,12 @@
     prevTask = &hFirstTask;
     while (*prevTask && (*prevTask != hTask))
     {
-        pTask = (TDB *)GlobalLock( *prevTask );
+        pTask = (TDB *)GlobalLock16( *prevTask );
         prevTask = &pTask->hNext;
     }
     if (*prevTask)
     {
-        pTask = (TDB *)GlobalLock( *prevTask );
+        pTask = (TDB *)GlobalLock16( *prevTask );
         *prevTask = pTask->hNext;
         pTask->hNext = 0;
         nTaskCount--;
@@ -248,7 +248,7 @@
     WORD free;
     THUNKS *pThunk;
 
-    pThunk = (THUNKS *)((BYTE *)GlobalLock( handle ) + offset);
+    pThunk = (THUNKS *)((BYTE *)GlobalLock16( handle ) + offset);
     pThunk->next = 0;
     pThunk->magic = THUNK_MAGIC;
     pThunk->free = (int)&pThunk->thunks - (int)pThunk;
@@ -274,7 +274,7 @@
     THUNKS *pThunk;
     WORD sel, base;
     
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return 0;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return 0;
     sel = pTask->hCSAlias;
     pThunk = &pTask->thunks;
     base = (int)pThunk - (int)pTask;
@@ -289,12 +289,12 @@
             TASK_CreateThunks( sel, 0, MIN_THUNKS );
             pThunk->next = sel;
         }
-        pThunk = (THUNKS *)GlobalLock( sel );
+        pThunk = (THUNKS *)GlobalLock16( sel );
         base = 0;
     }
     base += pThunk->free;
     pThunk->free = *(WORD *)((BYTE *)pThunk + pThunk->free);
-    return MAKELONG( base, sel );
+    return PTR_SEG_OFF_TO_SEGPTR( sel, base );
 }
 #endif
 
@@ -311,14 +311,14 @@
     THUNKS *pThunk;
     WORD sel, base;
     
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return 0;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return 0;
     sel = pTask->hCSAlias;
     pThunk = &pTask->thunks;
     base = (int)pThunk - (int)pTask;
     while (sel && (sel != HIWORD(thunk)))
     {
         sel = pThunk->next;
-        pThunk = (THUNKS *)GlobalLock( sel );
+        pThunk = (THUNKS *)GlobalLock16( sel );
         base = 0;
     }
     if (!sel) return FALSE;
@@ -339,7 +339,7 @@
 static void TASK_CallToStart(void)
 {
     int cs_reg, ds_reg, ip_reg;
-    TDB *pTask = (TDB *)GlobalLock( hCurrentTask );
+    TDB *pTask = (TDB *)GlobalLock16( hCurrentTask );
     NE_MODULE *pModule = MODULE_GetPtr( pTask->hModule );
     SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
 
@@ -406,24 +406,24 @@
     hTask = GLOBAL_Alloc( GMEM_FIXED | GMEM_ZEROINIT, sizeof(TDB),
                           hModule, FALSE, FALSE, FALSE );
     if (!hTask) return 0;
-    pTask = (TDB *)GlobalLock( hTask );
+    pTask = (TDB *)GlobalLock16( hTask );
 
       /* Allocate the new environment block */
 
     if (!(hParentEnv = hEnvironment))
     {
-        TDB *pParent = (TDB *)GlobalLock( hCurrentTask );
+        TDB *pParent = (TDB *)GlobalLock16( hCurrentTask );
         hParentEnv = pParent ? pParent->pdb.environment : hDOSEnvironment;
     }
     /* FIXME: do we really need to make a copy also when */
     /*        we don't use the parent environment? */
-    if (!(hEnvironment = GlobalAlloc( GMEM_FIXED, GlobalSize( hParentEnv ) )))
+    if (!(hEnvironment = GlobalAlloc16( GMEM_FIXED, GlobalSize16(hParentEnv))))
     {
-        GlobalFree( hTask );
+        GlobalFree16( hTask );
         return 0;
     }
-    memcpy( GlobalLock( hEnvironment ), GlobalLock( hParentEnv ),
-            GlobalSize( hParentEnv ) );
+    memcpy( GlobalLock16( hEnvironment ), GlobalLock16( hParentEnv ),
+            GlobalSize16( hParentEnv ) );
 
       /* Get current directory */
     
@@ -501,8 +501,8 @@
 
       /* Default DTA overwrites command-line */
 
-    pTask->dta = MAKELONG( (int)&pTask->pdb.cmdLine - (int)&pTask->pdb,
-                           pTask->hPDB );
+    pTask->dta = PTR_SEG_OFF_TO_SEGPTR( pTask->hPDB, 
+                                (int)&pTask->pdb.cmdLine - (int)&pTask->pdb );
 
       /* Allocate the 32-bit stack */
 
@@ -512,8 +512,8 @@
 
       /* Create the 32-bit stack frame */
 
-    *(DWORD *)GlobalLock(pTask->hStack32) = 0xDEADBEEF;
-    stack32Top = (char*)GlobalLock(pTask->hStack32) + STACK32_SIZE;
+    *(DWORD *)GlobalLock16(pTask->hStack32) = 0xDEADBEEF;
+    stack32Top = (char*)GlobalLock16(pTask->hStack32) + STACK32_SIZE;
     frame32 = (STACK32FRAME *)stack32Top - 1;
     frame32->saved_esp = (DWORD)stack32Top;
     frame32->edi = 0;
@@ -583,7 +583,7 @@
     TDB *pTask;
     HANDLE hPDB;
 
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return;
     hPDB = pTask->hPDB;
 
     /* Free the task module */
@@ -601,7 +601,7 @@
 
     /* Free the task structure itself */
 
-    GlobalFree( hTask );
+    GlobalFree16( hTask );
 
     /* Free all memory used by this task (including the 32-bit stack, */
     /* the environment block and the thunk segments). */
@@ -622,7 +622,7 @@
 {
     extern void EXEC_ExitWindows( int retCode );
 
-    TDB* pTask = (TDB*) GlobalLock( hCurrentTask );
+    TDB* pTask = (TDB*) GlobalLock16( hCurrentTask );
 
     /* Perform USER cleanup */
 
@@ -685,13 +685,13 @@
 
       /* Find a task to yield to */
 
-    pOldTask = (TDB *)GlobalLock( hCurrentTask );
+    pOldTask = (TDB *)GlobalLock16( hCurrentTask );
     if (pOldTask && pOldTask->hYieldTo)
     {
         /* If a task is stored in hYieldTo of the current task (put there */
         /* by DirectedYield), yield to it only if it has events pending.  */
         hTask = pOldTask->hYieldTo;
-        if (!(pNewTask = (TDB *)GlobalLock( hTask )) || !pNewTask->nEvents)
+        if (!(pNewTask = (TDB *)GlobalLock16( hTask )) || !pNewTask->nEvents)
             hTask = 0;
     }
 
@@ -700,7 +700,7 @@
         hTask = hFirstTask;
         while (hTask)
         {
-            pNewTask = (TDB *)GlobalLock( hTask );
+            pNewTask = (TDB *)GlobalLock16( hTask );
             if (pNewTask->nEvents && (hTask != hCurrentTask)) break;
             hTask = pNewTask->hNext;
         }
@@ -713,7 +713,7 @@
 
     if (!hTask) return;  /* Do nothing */
 
-    pNewTask = (TDB *)GlobalLock( hTask );
+    pNewTask = (TDB *)GlobalLock16( hTask );
     dprintf_task( stddeb, "Switching to task %04x (%.8s)\n",
                   hTask, pNewTask->module_name );
 
@@ -743,7 +743,7 @@
     IF1632_Saved16_ss   = pNewTask->ss;
     IF1632_Saved16_sp   = pNewTask->sp;
     IF1632_Saved32_esp  = pNewTask->esp;
-    IF1632_Stack32_base = WIN16_GlobalLock( pNewTask->hStack32 );
+    IF1632_Stack32_base = WIN16_GlobalLock16( pNewTask->hStack32 );
 #endif
 }
 
@@ -767,7 +767,7 @@
 #ifndef WINELIB
     EAX_reg(&context) = 0;
 #endif
-    if (!(pTask = (TDB *)GlobalLock( hCurrentTask ))) return;
+    if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return;
     if (!(pModule = MODULE_GetPtr( pTask->hModule ))) return;
 
     if (firstTask)
@@ -835,7 +835,7 @@
     TDB *pTask;
 
     if (!hTask) hTask = hCurrentTask;
-    pTask = (TDB *)GlobalLock( hTask );
+    pTask = (TDB *)GlobalLock16( hTask );
     if (pTask->nEvents > 0)
     {
         pTask->nEvents--;
@@ -856,7 +856,7 @@
     TDB *pTask;
 
     if (!hTask) hTask = hCurrentTask;
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return;
     pTask->nEvents++;
 }
 
@@ -870,7 +870,7 @@
     int newpriority;
 
     if (!hTask) hTask = hCurrentTask;
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return;
     newpriority = pTask->priority + delta;
     if (newpriority < -32) newpriority = -32;
     else if (newpriority > 15) newpriority = 15;
@@ -909,7 +909,7 @@
 {
     TDB *pCurTask;
 
-    pCurTask = (TDB *)GlobalLock( hCurrentTask );
+    pCurTask = (TDB *)GlobalLock16( hCurrentTask );
     if (pCurTask) pCurTask->nEvents++;  /* Make sure we get back here */
     TASK_SCHEDULE();
     if (pCurTask) pCurTask->nEvents--;
@@ -923,7 +923,7 @@
 {
     TDB *pCurTask;
 
-    if ((pCurTask = (TDB *)GlobalLock( hCurrentTask )) != NULL)
+    if ((pCurTask = (TDB *)GlobalLock16( hCurrentTask )) != NULL)
         pCurTask->hYieldTo = hTask;
 
     OldYield();
@@ -993,9 +993,9 @@
 
     /* Check if it is really a thunk */
     if ((thunk[0] == 0xb8) && (thunk[3] == 0xea))
-        handle = GlobalHandle( thunk[6] + (thunk[7] << 8) );
+        handle = GlobalHandle16( thunk[6] + (thunk[7] << 8) );
     else
-        handle = GlobalHandle( HIWORD(proc) );
+        handle = GlobalHandle16( HIWORD(proc) );
 
     return handle;
 #else
@@ -1013,7 +1013,7 @@
     TDB *pTask;
 
     if (!hTask) hTask = hCurrentTask;
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return 0;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return 0;
 
     hPrev = pTask->hQueue;
     pTask->hQueue = hQueue;
@@ -1032,7 +1032,7 @@
     TDB *pTask;
 
     if (!hTask) hTask = hCurrentTask;
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return 0;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return 0;
     return pTask->hQueue;
 }
 
@@ -1080,7 +1080,7 @@
 {
     TDB *pTask;
 
-    if (!(pTask = (TDB *)GlobalLock( hCurrentTask ))) return 0;
+    if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return 0;
     return pTask->hPDB;
 }
 
@@ -1090,10 +1090,10 @@
  */
 int GetInstanceData( HANDLE instance, WORD buffer, int len )
 {
-    char *ptr = (char *)GlobalLock( instance );
+    char *ptr = (char *)GlobalLock16( instance );
     if (!ptr || !len) return 0;
     if ((int)buffer + len >= 0x10000) len = 0x10000 - buffer;
-    memcpy( ptr + buffer, (char *)GlobalLock( CURRENT_DS ) + buffer, len );
+    memcpy( ptr + buffer, (char *)GlobalLock16( CURRENT_DS ) + buffer, len );
     return len;
 }
 
@@ -1106,7 +1106,7 @@
     TDB *pTask;
     UINT oldMode;
 
-    if (!(pTask = (TDB *)GlobalLock( hCurrentTask ))) return 0;
+    if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return 0;
     oldMode = pTask->error_mode;
     pTask->error_mode = mode;
     return oldMode;
@@ -1120,8 +1120,8 @@
 {
     TDB *pTask;
 
-    if (!(pTask = (TDB *)GlobalLock( hCurrentTask ))) return 0;
-    return (SEGPTR)WIN16_GlobalLock( pTask->pdb.environment );
+    if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return 0;
+    return (SEGPTR)WIN16_GlobalLock16( pTask->pdb.environment );
 }
 
 
@@ -1141,7 +1141,7 @@
 {
     TDB *pTask;
 
-    if (!(pTask = (TDB *)GlobalLock( hCurrentTask ))) return 0;
+    if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return 0;
     return pTask->hInstance;
 }
 
@@ -1153,8 +1153,8 @@
 {
     TDB *pTask;
 
-    if (!(pTask = (TDB *)GlobalLock( hTask ))) return FALSE;
-    if (GlobalSize( hTask ) < sizeof(TDB)) return FALSE;
+    if (!(pTask = (TDB *)GlobalLock16( hTask ))) return FALSE;
+    if (GlobalSize16( hTask ) < sizeof(TDB)) return FALSE;
     return (pTask->magic == TDB_MAGIC);
 }
 
@@ -1170,7 +1170,7 @@
 
       /* Check for module handle */
 
-    if (!(ptr = GlobalLock( handle ))) return 0;
+    if (!(ptr = GlobalLock16( handle ))) return 0;
     if (((NE_MODULE *)ptr)->magic == NE_SIGNATURE) return handle;
 
       /* Check the owner for module handle */
@@ -1180,7 +1180,7 @@
 #else
     owner = NULL;
 #endif
-    if (!(ptr = GlobalLock( owner ))) return 0;
+    if (!(ptr = GlobalLock16( owner ))) return 0;
     if (((NE_MODULE *)ptr)->magic == NE_SIGNATURE) return owner;
 
       /* Search for this handle and its owner inside all tasks */
@@ -1188,7 +1188,7 @@
     hTask = hFirstTask;
     while (hTask)
     {
-        TDB *pTask = (TDB *)GlobalLock( hTask );
+        TDB *pTask = (TDB *)GlobalLock16( hTask );
         if ((hTask == handle) ||
             (pTask->hInstance == handle) ||
             (pTask->hQueue == handle) ||
@@ -1223,7 +1223,7 @@
 
     dprintf_toolhelp( stddeb, "TaskNext(%p): task=%04x\n", lpte, lpte->hNext );
     if (!lpte->hNext) return FALSE;
-    pTask = (TDB *)GlobalLock( lpte->hNext );
+    pTask = (TDB *)GlobalLock16( lpte->hNext );
     if (!pTask || pTask->magic != TDB_MAGIC) return FALSE;
     pInstData = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN( pTask->hInstance, 0 );
     lpte->hTask         = lpte->hNext;
diff --git a/memory/atom.c b/memory/atom.c
index 9676a54..c871a8f 100644
--- a/memory/atom.c
+++ b/memory/atom.c
@@ -159,6 +159,7 @@
     if (!entry) return 0;
     /* Reload the table ptr in case it moved in linear memory */
     table = ATOM_GetTable( selector, FALSE );
+    str = PTR_SEG_TO_LIN( name );
     entryPtr = ATOM_MakePtr( selector, entry );
     entryPtr->next = table->entries[hash];
     entryPtr->refCount = 1;
diff --git a/memory/global.c b/memory/global.c
index 54dcd07..7803851 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -4,8 +4,6 @@
  * Copyright 1995 Alexandre Julliard
  */
 
-#ifndef WINELIB
-
 #include <sys/types.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -25,16 +23,16 @@
   /* Global arena block */
 typedef struct
 {
-    DWORD    base;           /* Base address (0 if discarded) */
-    DWORD    size;           /* Size in bytes (0 indicates a free block) */
-    HGLOBAL  handle;         /* Handle for this block */
-    HGLOBAL  hOwner;         /* Owner of this block */
-    BYTE     lockCount;      /* Count of GlobalFix() calls */
-    BYTE     pageLockCount;  /* Count of GlobalPageLock() calls */
-    BYTE     flags;          /* Allocation flags */
-    BYTE     selCount;       /* Number of selectors allocated for this block */
+    DWORD     base;          /* Base address (0 if discarded) */
+    DWORD     size;          /* Size in bytes (0 indicates a free block) */
+    HGLOBAL16 handle;        /* Handle for this block */
+    HGLOBAL16 hOwner;        /* Owner of this block */
+    BYTE      lockCount;     /* Count of GlobalFix() calls */
+    BYTE      pageLockCount; /* Count of GlobalPageLock() calls */
+    BYTE      flags;         /* Allocation flags */
+    BYTE      selCount;      /* Number of selectors allocated for this block */
 #ifdef CONFIG_IPC
-    int      shmid;
+    int       shmid;
 #endif
 } GLOBALARENA;
 
@@ -94,10 +92,10 @@
  *
  * Create a global heap block for a fixed range of linear memory.
  */
-HGLOBAL GLOBAL_CreateBlock( WORD flags, const void *ptr, DWORD size,
-                            HGLOBAL hOwner, BOOL isCode,
-                            BOOL is32Bit, BOOL isReadOnly,
-			    SHMDATA *shmdata  )
+HGLOBAL16 GLOBAL_CreateBlock( WORD flags, const void *ptr, DWORD size,
+                              HGLOBAL16 hOwner, BOOL isCode,
+                              BOOL is32Bit, BOOL isReadOnly,
+                              SHMDATA *shmdata  )
 {
     WORD sel, selcount;
     GLOBALARENA *pArena;
@@ -158,7 +156,7 @@
  * Free a block allocated by GLOBAL_CreateBlock, without touching
  * the associated linear memory range.
  */
-BOOL GLOBAL_FreeBlock( HGLOBAL handle )
+BOOL GLOBAL_FreeBlock( HGLOBAL16 handle )
 {
     WORD sel;
 
@@ -173,13 +171,13 @@
 /***********************************************************************
  *           GLOBAL_Alloc
  *
- * Implementation of GlobalAlloc()
+ * Implementation of GlobalAlloc16()
  */
-HGLOBAL GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL hOwner,
-                      BOOL isCode, BOOL is32Bit, BOOL isReadOnly )
+HGLOBAL16 GLOBAL_Alloc( UINT16 flags, DWORD size, HGLOBAL16 hOwner,
+                        BOOL isCode, BOOL is32Bit, BOOL isReadOnly )
 {
     void *ptr;
-    HGLOBAL handle;
+    HGLOBAL16 handle;
     SHMDATA shmdata;
 
     dprintf_global( stddeb, "GlobalAlloc: %ld flags=%04x\n", size, flags );
@@ -265,11 +263,11 @@
 
 
 /***********************************************************************
- *           GlobalAlloc   (KERNEL.15)
+ *           GlobalAlloc16   (KERNEL.15)
  */
-HGLOBAL GlobalAlloc( WORD flags, DWORD size )
+HGLOBAL16 GlobalAlloc16( UINT16 flags, DWORD size )
 {
-    HANDLE owner = GetCurrentPDB();
+    HANDLE16 owner = GetCurrentPDB();
 
     if (flags & GMEM_DDESHARE)
         owner = GetExePtr(owner);  /* Make it a module handle */
@@ -278,9 +276,9 @@
 
 
 /***********************************************************************
- *           GlobalReAlloc   (KERNEL.16)
+ *           GlobalReAlloc16   (KERNEL.16)
  */
-HGLOBAL GlobalReAlloc( HGLOBAL handle, DWORD size, WORD flags )
+HGLOBAL16 GlobalReAlloc16( HGLOBAL16 handle, DWORD size, UINT16 flags )
 {
     WORD selcount;
     DWORD oldsize;
@@ -288,14 +286,14 @@
     GLOBALARENA *pArena, *pNewArena;
     WORD sel = GlobalHandleToSel( handle );
 
-    dprintf_global( stddeb, "GlobalReAlloc: %04x %ld flags=%04x\n",
+    dprintf_global( stddeb, "GlobalReAlloc16: %04x %ld flags=%04x\n",
                     handle, size, flags );
     if (!handle) return 0;
     
 #ifdef CONFIG_IPC
     if (Options.ipc && (flags & GMEM_DDESHARE || is_dde_handle(handle))) {
 	fprintf(stdnimp,
-		"GlobalReAlloc: shared memory reallocating unimplemented\n"); 
+               "GlobalReAlloc16: shared memory reallocating unimplemented\n"); 
 	return 0;
     }
 #endif  /* CONFIG_IPC */
@@ -384,13 +382,13 @@
 
 
 /***********************************************************************
- *           GlobalFree   (KERNEL.17)
+ *           GlobalFree16   (KERNEL.17)
  */
-HGLOBAL GlobalFree( HGLOBAL handle )
+HGLOBAL16 GlobalFree16( HGLOBAL16 handle )
 {
-    void *ptr = GlobalLock( handle );
+    void *ptr = GlobalLock16( handle );
 
-    dprintf_global( stddeb, "GlobalFree: %04x\n", handle );
+    dprintf_global( stddeb, "GlobalFree16: %04x\n", handle );
     if (!GLOBAL_FreeBlock( handle )) return handle;  /* failed */
 #ifdef CONFIG_IPC
     if (is_dde_handle(handle)) return DDE_GlobalFree(handle);
@@ -401,80 +399,84 @@
 
 
 /***********************************************************************
- *           WIN16_GlobalLock   (KERNEL.18)
+ *           WIN16_GlobalLock16   (KERNEL.18)
  *
- * This is the GlobalLock() function used by 16-bit code.
+ * This is the GlobalLock16() function used by 16-bit code.
  */
-SEGPTR WIN16_GlobalLock( HGLOBAL handle )
+SEGPTR WIN16_GlobalLock16( HGLOBAL16 handle )
 {
-    dprintf_global( stddeb, "WIN16_GlobalLock(%04x) -> %08lx\n",
+#ifndef WINELIB
+    dprintf_global( stddeb, "WIN16_GlobalLock16(%04x) -> %08lx\n",
                     handle, MAKELONG( 0, GlobalHandleToSel(handle)) );
     if (!handle) return 0;
 
 #ifdef CONFIG_IPC
     if (is_dde_handle(handle))
-        return (SEGPTR)MAKELONG( 0, DDE_GlobalHandleToSel(handle) );
+        return PTR_SEG_OFF_TO_SEGPTR( DDE_GlobalHandleToSel(handle), 0 );
 #endif  /* CONFIG_IPC */
 
     if (!GET_ARENA_PTR(handle)->base) return (SEGPTR)0;
-    return (SEGPTR)MAKELONG( 0, GlobalHandleToSel(handle) );
+    return PTR_SEG_OFF_TO_SEGPTR( GlobalHandleToSel(handle), 0 );
+#else  /* WINELIB */
+    return GlobalLock16( handle );
+#endif  /* WINELIB */
 }
 
 
 /***********************************************************************
- *           GlobalLock   (KERNEL.18)
+ *           GlobalLock16   (KERNEL.18)
  *
- * This is the GlobalLock() function used by 32-bit code.
+ * This is the GlobalLock16() function used by 32-bit code.
  */
-LPVOID GlobalLock( HGLOBAL handle )
+LPVOID GlobalLock16( HGLOBAL16 handle )
 {
     if (!handle) return 0;
 #ifdef CONFIG_IPC
     if (is_dde_handle(handle)) return DDE_AttachHandle(handle, NULL);
 #endif
-    return (LPSTR)GET_ARENA_PTR(handle)->base;
+    return (LPVOID)GET_ARENA_PTR(handle)->base;
 }
 
 
 /***********************************************************************
- *           GlobalUnlock   (KERNEL.19)
+ *           GlobalUnlock16   (KERNEL.19)
  */
-BOOL GlobalUnlock( HGLOBAL handle )
+BOOL GlobalUnlock16( HGLOBAL16 handle )
 {
-    dprintf_global( stddeb, "GlobalUnlock: %04x\n", handle );
+    dprintf_global( stddeb, "GlobalUnlock16: %04x\n", handle );
     return 0;
 }
 
 
 /***********************************************************************
- *           GlobalSize   (KERNEL.20)
+ *           GlobalSize16   (KERNEL.20)
  */
-DWORD GlobalSize( HGLOBAL handle )
+DWORD GlobalSize16( HGLOBAL16 handle )
 {
-    dprintf_global( stddeb, "GlobalSize: %04x\n", handle );
+    dprintf_global( stddeb, "GlobalSize16: %04x\n", handle );
     if (!handle) return 0;
     return GET_ARENA_PTR(handle)->size;
 }
 
 
 /***********************************************************************
- *           GlobalHandle   (KERNEL.21)
+ *           GlobalHandle16   (KERNEL.21)
  */
-DWORD GlobalHandle( WORD sel )
+DWORD GlobalHandle16( WORD sel )
 {
-    dprintf_global( stddeb, "GlobalHandle: %04x\n", sel );
+    dprintf_global( stddeb, "GlobalHandle16: %04x\n", sel );
     return MAKELONG( GET_ARENA_PTR(sel)->handle, GlobalHandleToSel(sel) );
 }
 
 
 /***********************************************************************
- *           GlobalFlags   (KERNEL.22)
+ *           GlobalFlags16   (KERNEL.22)
  */
-WORD GlobalFlags( HGLOBAL handle )
+UINT16 GlobalFlags16( HGLOBAL16 handle )
 {
     GLOBALARENA *pArena;
 
-    dprintf_global( stddeb, "GlobalFlags: %04x\n", handle );
+    dprintf_global( stddeb, "GlobalFlags16: %04x\n", handle );
     pArena = GET_ARENA_PTR(handle);
     return pArena->lockCount |
            ((pArena->flags & GA_DISCARDABLE) ? GMEM_DISCARDABLE : 0) |
@@ -507,9 +509,9 @@
 
 
 /***********************************************************************
- *           GlobalCompact   (KERNEL.25)
+ *           GlobalCompact16   (KERNEL.25)
  */
-DWORD GlobalCompact( DWORD desired )
+DWORD GlobalCompact16( DWORD desired )
 {
     return GLOBAL_MAX_ALLOC_SIZE;
 }
@@ -518,7 +520,7 @@
 /***********************************************************************
  *           GlobalFreeAll   (KERNEL.26)
  */
-void GlobalFreeAll( HANDLE owner )
+void GlobalFreeAll( HGLOBAL16 owner )
 {
     DWORD i;
     GLOBALARENA *pArena;
@@ -527,7 +529,7 @@
     for (i = 0; i < globalArenaSize; i++, pArena++)
     {
         if ((pArena->size != 0) && (pArena->hOwner == owner))
-            GlobalFree( pArena->handle );
+            GlobalFree16( pArena->handle );
     }
 }
 
@@ -535,18 +537,18 @@
 /***********************************************************************
  *           GlobalWire   (KERNEL.111)
  */
-SEGPTR GlobalWire( HGLOBAL handle )
+SEGPTR GlobalWire( HGLOBAL16 handle )
 {
-    return WIN16_GlobalLock( handle );
+    return WIN16_GlobalLock16( handle );
 }
 
 
 /***********************************************************************
  *           GlobalUnWire   (KERNEL.112)
  */
-BOOL GlobalUnWire( HGLOBAL handle )
+BOOL GlobalUnWire( HGLOBAL16 handle )
 {
-    return GlobalUnlock( handle );
+    return GlobalUnlock16( handle );
 }
 
 
@@ -555,7 +557,7 @@
  */
 DWORD GlobalDOSAlloc( DWORD size )
 {
-    WORD sel = GlobalAlloc( GMEM_FIXED, size );
+    WORD sel = GlobalAlloc16( GMEM_FIXED, size );
     if (!sel) return 0;
     return MAKELONG( sel, sel /* this one ought to be a real-mode segment */ );
 }
@@ -566,7 +568,7 @@
  */
 WORD GlobalDOSFree( WORD sel )
 {
-    return GlobalFree( GlobalHandle(sel) ) ? sel : 0;
+    return GlobalFree16( GlobalHandle16(sel) ) ? sel : 0;
 }
 
 
@@ -583,7 +585,7 @@
 /***********************************************************************
  *           GlobalLRUOldest   (KERNEL.163)
  */
-HGLOBAL GlobalLRUOldest( HGLOBAL handle )
+HGLOBAL16 GlobalLRUOldest( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalLRUOldest: %04x\n", handle );
     if (handle == (HGLOBAL)-1) handle = CURRENT_DS;
@@ -594,7 +596,7 @@
 /***********************************************************************
  *           GlobalLRUNewest   (KERNEL.164)
  */
-HGLOBAL GlobalLRUNewest( HGLOBAL handle )
+HGLOBAL16 GlobalLRUNewest( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalLRUNewest: %04x\n", handle );
     if (handle == (HGLOBAL)-1) handle = CURRENT_DS;
@@ -605,7 +607,7 @@
 /***********************************************************************
  *           GetFreeSpace   (KERNEL.169)
  */
-DWORD GetFreeSpace( UINT wFlags )
+DWORD GetFreeSpace( UINT16 wFlags )
 {
     return GLOBAL_MAX_ALLOC_SIZE;
 }
@@ -614,7 +616,7 @@
 /***********************************************************************
  *           GlobalPageLock   (KERNEL.191)
  */
-WORD GlobalPageLock( HGLOBAL handle )
+WORD GlobalPageLock( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalPageLock: %04x\n", handle );
     return ++(GET_ARENA_PTR(handle)->pageLockCount);
@@ -624,7 +626,7 @@
 /***********************************************************************
  *           GlobalPageUnlock   (KERNEL.192)
  */
-WORD GlobalPageUnlock( HGLOBAL handle )
+WORD GlobalPageUnlock( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalPageUnlock: %04x\n", handle );
     return --(GET_ARENA_PTR(handle)->pageLockCount);
@@ -634,7 +636,7 @@
 /***********************************************************************
  *           GlobalFix   (KERNEL.197)
  */
-void GlobalFix( HGLOBAL handle )
+void GlobalFix( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalFix: %04x\n", handle );
     GET_ARENA_PTR(handle)->lockCount++;
@@ -644,7 +646,7 @@
 /***********************************************************************
  *           GlobalUnfix   (KERNEL.198)
  */
-void GlobalUnfix( HGLOBAL handle )
+void GlobalUnfix( HGLOBAL16 handle )
 {
     dprintf_global( stddeb, "GlobalUnfix: %04x\n", handle );
     GET_ARENA_PTR(handle)->lockCount--;
@@ -672,7 +674,7 @@
 /***********************************************************************
  *           GlobalHandleToSel   (TOOLHELP.50)
  */
-WORD GlobalHandleToSel( HGLOBAL handle )
+WORD GlobalHandleToSel( HGLOBAL16 handle )
 {
     dprintf_toolhelp( stddeb, "GlobalHandleToSel: %04x\n", handle );
     if (!handle) return 0;
@@ -752,7 +754,7 @@
 /***********************************************************************
  *           GlobalEntryHandle   (TOOLHELP.54)
  */
-BOOL GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL hItem )
+BOOL GlobalEntryHandle( GLOBALENTRY *pGlobal, HGLOBAL16 hItem )
 {
     return FALSE;
 }
@@ -761,7 +763,7 @@
 /***********************************************************************
  *           GlobalEntryModule   (TOOLHELP.55)
  */
-BOOL GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE hModule, WORD wSeg )
+BOOL GlobalEntryModule( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg )
 {
     return FALSE;
 }
@@ -818,23 +820,98 @@
 #endif
 }
 
-/***********************************************************************
- *               GlobalAlloc32
- * implements    GlobalAlloc        (KERNEL32.316)
- *               LocalAlloc         (KERNEL32.372)
- */
-void *GlobalAlloc32(int flags,int size)
-{
-    dprintf_global(stddeb,"GlobalAlloc32(%x,%x)\n",flags,size);
-    return malloc(size);
-}
-
-/***********************************************************************
- *               GlobalLock32
- */
-void* GlobalLock32(DWORD ptr)
-{
-	return (void*)ptr;
-}
+#ifndef WINELIB
 
 #endif  /* WINELIB */
+
+/***********************************************************************
+ *           GlobalAlloc32   (KERNEL32.315)
+ */
+HGLOBAL32 GlobalAlloc32( UINT32 flags, DWORD size )
+{
+    DWORD heapFlags = 0;
+
+    if (flags & GMEM_MOVEABLE)
+        fprintf( stderr, "GlobalAlloc32: unimplemented flag GMEM_MOVEABLE\n" );
+
+    if (flags & GMEM_ZEROINIT) heapFlags |= HEAP_ZERO_MEMORY;
+    return (HGLOBAL32)HeapAlloc( GetProcessHeap(), heapFlags, size );
+}
+
+
+/***********************************************************************
+ *           GlobalCompact32   (KERNEL32.316)
+ */
+DWORD GlobalCompact32( DWORD minfree )
+{
+    return 0;  /* GlobalCompact does nothing in Win32 */
+}
+
+
+/***********************************************************************
+ *           GlobalFlags32   (KERNEL32.321)
+ */
+UINT32 GlobalFlags32( HGLOBAL32 handle )
+{
+    return 0;
+}
+
+
+/***********************************************************************
+ *           GlobalFree32   (KERNEL32.322)
+ */
+HGLOBAL32 GlobalFree32( HGLOBAL32 handle )
+{
+    return HeapFree( GetProcessHeap(), 0, (LPVOID)handle ) ? 0 : handle;
+}
+
+
+/***********************************************************************
+ *           GlobalHandle32   (KERNEL32.325)
+ */
+HGLOBAL32 GlobalHandle32( LPCVOID ptr )
+{
+    return (HGLOBAL32)ptr;
+}
+
+
+/***********************************************************************
+ *           GlobalLock32   (KERNEL32.326)
+ */
+LPVOID GlobalLock32( HGLOBAL32 handle )
+{
+    return (LPVOID)handle;
+}
+
+
+/***********************************************************************
+ *           GlobalReAlloc32   (KERNEL32.328)
+ */
+HGLOBAL32 GlobalReAlloc32( HGLOBAL32 handle, DWORD size, UINT32 flags )
+{
+    if (flags & GMEM_MODIFY)
+    {
+        fprintf( stderr, "GlobalReAlloc32: GMEM_MODIFY not supported\n" );
+        return 0;
+    }
+
+    return (HGLOBAL32)HeapReAlloc( GetProcessHeap(), 0, (LPVOID)handle, size );
+}
+
+
+/***********************************************************************
+ *           GlobalSize32   (KERNEL32.329)
+ */
+DWORD GlobalSize32( HGLOBAL32 handle )
+{
+    return HeapSize( GetProcessHeap(), 0, (LPVOID)handle );
+}
+
+
+/***********************************************************************
+ *           GlobalUnlock32   (KERNEL32.332)
+ */
+BOOL GlobalUnlock32( HGLOBAL32 handle )
+{
+    return TRUE;
+}
diff --git a/memory/local.c b/memory/local.c
index ff9ae25..38cb3ea 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -2,6 +2,7 @@
  * Local heap functions
  *
  * Copyright 1995 Alexandre Julliard
+ * Copyright 1996 Huw Davies
  */
 
 /*
@@ -11,8 +12,6 @@
  * parameter than usual.
  */
 
-#ifndef WINELIB
-
 #include <stdlib.h>
 #include <string.h>
 #include "windows.h"
@@ -25,7 +24,6 @@
 #include "stddebug.h"
 #include "debug.h"
 
-
 #ifndef WINELIB
 #pragma pack(1)
 #endif
@@ -47,7 +45,6 @@
   /* Arena types (stored in 'prev' field of the arena) */
 #define LOCAL_ARENA_FREE       0
 #define LOCAL_ARENA_FIXED      1
-#define LOCAL_ARENA_MOVEABLE   3
 
 /* Layout of a handle entry table
  *
@@ -97,9 +94,9 @@
 #define LALIGN(word)          (((word) + 3) & ~3)
 
 #define ARENA_PTR(ptr,arena)       ((LOCALARENA *)((char*)(ptr)+(arena)))
-#define ARENA_PREV(ptr,arena)      (ARENA_PTR(ptr,arena)->prev & ~3)
-#define ARENA_NEXT(ptr,arena)      (ARENA_PTR(ptr,arena)->next)
-#define ARENA_FLAGS(ptr,arena)     (ARENA_PTR(ptr,arena)->prev & 3)
+#define ARENA_PREV(ptr,arena)      (ARENA_PTR((ptr),(arena))->prev & ~3)
+#define ARENA_NEXT(ptr,arena)      (ARENA_PTR((ptr),(arena))->next)
+#define ARENA_FLAGS(ptr,arena)     (ARENA_PTR((ptr),(arena))->prev & 3)
 
   /* determine whether the handle belongs to a fixed or a moveable block */
 #define HANDLE_FIXED(handle) (((handle) & 3) == 0)
@@ -110,7 +107,7 @@
  *
  * Return a pointer to the local heap, making sure it exists.
  */
-static LOCALHEAPINFO *LOCAL_GetHeap( WORD ds )
+static LOCALHEAPINFO *LOCAL_GetHeap( HANDLE16 ds )
 {
     LOCALHEAPINFO *pInfo;
     INSTANCEDATA *ptr = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN( ds, 0 );
@@ -196,7 +193,7 @@
     LOCALARENA *pPrev = ARENA_PTR( baseptr, prev );
     LOCALARENA *pNew  = ARENA_PTR( baseptr, new );
 
-    pNew->prev = prev | LOCAL_ARENA_FIXED;
+    pNew->prev = (prev & ~3) | LOCAL_ARENA_FIXED;
     pNew->next = pPrev->next;
     ARENA_PTR(baseptr,pPrev->next)->prev &= 3;
     ARENA_PTR(baseptr,pPrev->next)->prev |= new;
@@ -239,7 +236,7 @@
 /***********************************************************************
  *           LOCAL_PrintHeap
  */
-static void LOCAL_PrintHeap( WORD ds )
+static void LOCAL_PrintHeap( HANDLE16 ds )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo = LOCAL_GetHeap( ds );
@@ -329,7 +326,7 @@
                  * of minsize + stacksize, since there are programs that
                  * resize the data segment before calling InitTask(). So,
                  * we must put it at the end of the segment */
-		start = GlobalSize( GlobalHandle( selector ) );
+		start = GlobalSize16( GlobalHandle16( selector ) );
 		start -= end;
 		end += start;
 		dprintf_local( stddeb," new start %04x, minstart: %04x\n", start, pSeg->minsize + pModule->stack_size);
@@ -404,10 +401,10 @@
 /***********************************************************************
  *           LOCAL_GrowHeap
  */
-static void LOCAL_GrowHeap( WORD ds )
+static void LOCAL_GrowHeap( HANDLE16 ds )
 {
-    HANDLE hseg = GlobalHandle( ds );
-    LONG oldsize = GlobalSize( hseg );
+    HANDLE hseg = GlobalHandle16( ds );
+    LONG oldsize = GlobalSize16( hseg );
     LONG end;
     LOCALHEAPINFO *pHeapInfo;
     WORD freeArena, lastArena;
@@ -416,14 +413,14 @@
     
     /* if nothing can be gained, return */
     if (oldsize > 0xfff0) return;
-    hseg = GlobalReAlloc( hseg, 0x10000, GMEM_FIXED );
+    hseg = GlobalReAlloc16( hseg, 0x10000, GMEM_FIXED );
     ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     pHeapInfo = LOCAL_GetHeap( ds );
     if (pHeapInfo == NULL) {
 	fprintf( stderr, "Local_GrowHeap: heap not found\n" );
 	return;
     }
-    end = GlobalSize( hseg );
+    end = GlobalSize16( hseg );
     lastArena = (end - sizeof(LOCALARENA)) & ~3;
 
       /* Update the HeapInfo */
@@ -433,12 +430,11 @@
     pHeapInfo->minsize += end - oldsize;
     
       /* grow the old last block */
-      /* FIXME: merge two adjacent free blocks */
     pArena = ARENA_PTR( ptr, freeArena );
     pArena->size      = lastArena - freeArena;
     pArena->next      = lastArena;
     pArena->free_next = lastArena;
-    
+
       /* Initialise the new last block */
 
     pLastArena = ARENA_PTR( ptr, lastArena );
@@ -448,14 +444,71 @@
     pLastArena->free_prev = freeArena;
     pLastArena->free_next = lastArena;  /* this one */
     
+    /* If block before freeArena is also free then merge them */
+    if((ARENA_PTR(ptr, (pArena->prev & ~3))->prev & 3) == LOCAL_ARENA_FREE)
+    {
+        LOCAL_RemoveBlock(ptr, freeArena);
+        pHeapInfo->items--;
+    }
+
     dprintf_local( stddeb, "Heap expanded\n" );
     LOCAL_PrintHeap( ds );
 }
 
+
 /***********************************************************************
- *           LOCAL_Compact
+ *           LOCAL_FreeArena
  */
-static WORD LOCAL_Compact( WORD ds, WORD minfree, WORD flags )
+static HLOCAL16 LOCAL_FreeArena( WORD ds, WORD arena )
+{
+    char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
+    LOCALHEAPINFO *pInfo;
+    LOCALARENA *pArena, *pPrev, *pNext;
+
+    dprintf_local( stddeb, "LocalFreeArena: %04x ds=%04x\n", arena, ds );
+    if (!(pInfo = LOCAL_GetHeap( ds ))) return arena;
+
+    pArena = ARENA_PTR( ptr, arena );
+    if ((pArena->prev & 3) == LOCAL_ARENA_FREE)
+    {
+	/* shouldn't happen */
+        fprintf( stderr, "LocalFreeArena: Trying to free block %04x twice!\n",
+                 arena );
+	LOCAL_PrintHeap( ds );
+	return arena;
+    }
+
+      /* Check if we can merge with the previous block */
+
+    pPrev = ARENA_PTR( ptr, pArena->prev & ~3 );
+    pNext = ARENA_PTR( ptr, pArena->next );
+    if ((pPrev->prev & 3) == LOCAL_ARENA_FREE)
+    {
+        arena  = pArena->prev & ~3;
+        pArena = pPrev;
+        LOCAL_RemoveBlock( ptr, pPrev->next );
+        pInfo->items--;
+    }
+    else  /* Make a new free block */
+    {
+        LOCAL_MakeBlockFree( ptr, arena );
+    }
+
+      /* Check if we can merge with the next block */
+
+    if ((pArena->next == pArena->free_next) &&
+        (pArena->next != pInfo->last))
+    {
+        LOCAL_RemoveBlock( ptr, pArena->next );
+        pInfo->items--;
+    }
+    return 0;
+}
+
+/***********************************************************************
+ *           LOCAL_GetFreeSpace
+ */
+static WORD LOCAL_GetFreeSpace(WORD ds, WORD countdiscard)
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo;
@@ -465,34 +518,171 @@
     
     if (!(pInfo = LOCAL_GetHeap( ds )))
     {
-        fprintf( stderr, "Local_FindFreeBlock: Local heap not found\n" );
-	LOCAL_PrintHeap(ds);
-	return 0;
+        fprintf( stderr, "LOCAL_GetFreeSpace: Local heap not found\n" );
+        LOCAL_PrintHeap(ds);
+        return 0;
     }
-
     arena = pInfo->first;
     pArena = ARENA_PTR( ptr, arena );
-    while (arena != pArena->free_next) {
+    while (arena != pArena->free_next)
+    {
         arena = pArena->free_next;
         pArena = ARENA_PTR( ptr, arena );
         if (pArena->size >= freespace) freespace = pArena->size;
     }
-
-    if(freespace < ARENA_HEADER_SIZE)
-	freespace = 0;
-    else
-	freespace -= ARENA_HEADER_SIZE;
-    
-    if (flags & LMEM_NOCOMPACT) return freespace;
-    
-    if (flags & LMEM_NODISCARD) return freespace;
+    /* FIXME doesn't yet calculate space that would become free if everything
+       were discarded when countdiscard == 1 */
+    if (freespace < ARENA_HEADER_SIZE) freespace = 0;
+    else freespace -= ARENA_HEADER_SIZE;
     return freespace;
 }
 
+
+/***********************************************************************
+ *           LOCAL_Compact
+ */
+static WORD LOCAL_Compact( HANDLE16 ds, WORD minfree, WORD flags )
+{
+    char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 ), *fcp, *mcp;
+    LOCALHEAPINFO *pInfo;
+    LOCALARENA *pArena, *pMoveArena, *pFinalArena;
+    WORD arena, movearena, finalarena, table;
+    WORD count, movesize, size, i;
+    WORD freespace;
+    LOCALHANDLEENTRY *pEntry;
+
+    if (!(pInfo = LOCAL_GetHeap( ds )))
+    {
+        fprintf( stderr, "Local_Compact: Local heap not found\n" );
+        LOCAL_PrintHeap(ds);
+        return 0;
+    }
+    dprintf_local(stddeb,
+                  "LOCAL_Compact: ds = %04x, minfree = %04x, flags = %04x\n",
+                  ds, minfree, flags);
+    freespace = LOCAL_GetFreeSpace(ds, minfree ? 0 : 1);
+    if(freespace >= minfree || (flags & LMEM_NOCOMPACT))
+    {
+        dprintf_local(stddeb, "Returning %04x.\n", freespace);
+        return freespace;
+    }
+    dprintf_local(stddeb, "Local_Compact: Compacting heap %04x.\n", ds);
+    table = pInfo->htable;
+    while(table)
+    {
+        pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
+        for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++)
+        {
+            if((pEntry->lock == 0) && !(pEntry->flags &
+                                        (LMEM_DISCARDED >> 8)))
+            {
+                /* OK we can move this one if we want */
+                dprintf_local(stddeb,
+                              "handle %04x (block %04x) can be moved.\n",
+                              (WORD)((char *)pEntry - ptr), pEntry->addr);
+                movearena = ARENA_HEADER(pEntry->addr);
+                pMoveArena = ARENA_PTR(ptr, movearena);
+                movesize = pMoveArena->next - movearena;
+                arena = pInfo->first;
+                pArena = ARENA_PTR(ptr, arena);
+                size = 0xffff;
+                finalarena = 0;
+                /* Try to find the smallest arena that will do, */
+                /* which is below us in memory */
+                for(;;)
+                {
+                    arena = pArena->free_next;
+                    pArena = ARENA_PTR(ptr, arena);
+                    if(arena >= movearena)
+                        break;
+                    if(arena == pArena->free_next)
+                        break;
+                    if((pArena->size >= movesize) && (pArena->size < size))
+                    {
+                        size = pArena->size;
+                        finalarena = arena;
+                    }
+                }
+                if (finalarena) /* Actually got somewhere to move */
+                {
+                    dprintf_local(stddeb, "Moving it to %04x.\n", finalarena);
+                    pFinalArena = ARENA_PTR(ptr, finalarena);
+
+	 /* Check to see if it's worth creating a free arena at the end */
+                    if(pFinalArena->size > movesize+LALIGN(sizeof(LOCALARENA)))
+                    {
+                        LOCAL_AddBlock(ptr, finalarena, finalarena + movesize);
+                        LOCAL_MakeBlockFree(ptr, finalarena + movesize);
+                        pInfo->items++;
+                    }
+                    /* Copy the arena to it's new location */
+                    LOCAL_RemoveFreeBlock(ptr, finalarena);
+                    memcpy((char *)pFinalArena + ARENA_HEADER_SIZE,
+                           (char *)pMoveArena + ARENA_HEADER_SIZE,
+                           movesize - ARENA_HEADER_SIZE );
+                    /* Free the old location */  
+                    LOCAL_FreeArena(ds, movearena);
+                    /* Update handle table entry */
+                    pEntry->addr = finalarena + ARENA_HEADER_SIZE;
+                }
+                else if((ARENA_PTR(ptr, pMoveArena->prev & ~3)->prev & 3)
+			       == LOCAL_ARENA_FREE)
+                {
+                    /* Previous arena is free (but < movesize)  */
+                    /* so we can 'slide' movearena down into it */
+                    finalarena = pMoveArena->prev & ~3;
+                    pFinalArena = ARENA_PTR(ptr, finalarena);
+                    dprintf_local(stddeb, "Sliding arena %04x to %04x.\n",
+                                  movearena, finalarena);
+                    LOCAL_RemoveFreeBlock(ptr, finalarena);
+                    LOCAL_RemoveBlock(ptr, movearena);
+                    mcp = (char *)pMoveArena + ARENA_HEADER_SIZE;
+                    fcp = (char *)pFinalArena + ARENA_HEADER_SIZE;
+                    for(i = 0; i < movesize - ARENA_HEADER_SIZE; i++)
+                        *(fcp++) = *(mcp++);
+                    LOCAL_AddBlock(ptr, finalarena, finalarena + movesize);
+                    LOCAL_MakeBlockFree(ptr, finalarena + movesize);
+                    /* Update handle table entry */
+                    pEntry->addr = finalarena + ARENA_HEADER_SIZE;
+                }
+            }
+        }
+        table = *(WORD *)pEntry;
+    }
+    freespace = LOCAL_GetFreeSpace(ds, minfree ? 0 : 1);
+    if(freespace >= minfree || (flags & LMEM_NODISCARD))
+    {
+        dprintf_local(stddeb, "Returning %04x.\n", freespace);
+        return freespace;
+    }
+
+    table = pInfo->htable;
+    while(table)
+    {
+        pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
+        for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++)
+        {
+            if((pEntry->flags & (LMEM_DISCARDABLE >> 8)) &&
+               pEntry->lock == 0 && !(pEntry->flags & (LMEM_DISCARDED >> 8)))
+            {
+                dprintf_local(stddeb, "Discarding handle %04x (block %04x).\n",
+                              (char *)pEntry - ptr, pEntry->addr);
+                LOCAL_FreeArena(ds, pEntry->addr);
+                pEntry->addr = 0;
+                pEntry->flags |= (LMEM_DISCARDED >> 8);
+                /* Call localnotify proc */
+            }
+        }
+        table = *(WORD *)pEntry;
+    }
+    return LOCAL_Compact(ds, 0xffff, LMEM_NODISCARD);
+}
+
+
 /***********************************************************************
  *           LOCAL_FindFreeBlock
  */
-static HLOCAL LOCAL_FindFreeBlock( WORD ds, WORD size )
+static HLOCAL16 LOCAL_FindFreeBlock( HANDLE16 ds, WORD size )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo;
@@ -524,7 +714,7 @@
  * The segment may get moved around in this function, so all callers
  * should reset their pointer variables.
  */
-static HLOCAL LOCAL_GetBlock( WORD ds, WORD size, WORD flags )
+static HLOCAL16 LOCAL_GetBlock( HANDLE16 ds, WORD size, WORD flags )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo;
@@ -585,12 +775,12 @@
 /***********************************************************************
  *           LOCAL_NewHTable
  */
-static BOOL LOCAL_NewHTable( WORD ds )
+static BOOL LOCAL_NewHTable( HANDLE16 ds )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo;
     LOCALHANDLEENTRY *pEntry;
-    HLOCAL handle;
+    HLOCAL16 handle;
     int i;
 
     dprintf_local( stddeb, "Local_NewHTable\n" );
@@ -601,11 +791,13 @@
         return FALSE;
     }
 
-    handle = LOCAL_GetBlock( ds, pInfo->hdelta * sizeof(LOCALHANDLEENTRY)
-                                  + 2 * sizeof(WORD), LMEM_FIXED );
-    ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
-    pInfo = LOCAL_GetHeap( ds );
-    if (handle == 0) return FALSE;
+    if (!(handle = LOCAL_GetBlock( ds, pInfo->hdelta * sizeof(LOCALHANDLEENTRY)
+                                   + 2 * sizeof(WORD), LMEM_FIXED )))
+        return FALSE;
+    if (!(ptr = PTR_SEG_OFF_TO_LIN( ds, 0 )))
+        fprintf(stderr, "LOCAL_NewHTable: ptr == NULL after GetBlock.\n");
+    if (!(pInfo = LOCAL_GetHeap( ds )))
+        fprintf(stderr,"LOCAL_NewHTable: pInfo == NULL after GetBlock.\n");
 
     /* Fill the entry table */
 
@@ -621,7 +813,7 @@
 /***********************************************************************
  *           LOCAL_GetNewHandleEntry
  */
-static HLOCAL LOCAL_GetNewHandleEntry( WORD ds )
+static HLOCAL16 LOCAL_GetNewHandleEntry( HANDLE16 ds )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo;
@@ -661,57 +853,7 @@
     pEntry->lock = 0;
     dprintf_local( stddeb, "LOCAL_GetNewHandleEntry(%04x): %04x\n",
                    ds, ((char *)pEntry - ptr) );
-    return (HLOCAL)((char *)pEntry - ptr);
-}
-
-
-/***********************************************************************
- *           LOCAL_FreeArena
- */
-static HLOCAL LOCAL_FreeArena( WORD ds, WORD arena )
-{
-    char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
-    LOCALHEAPINFO *pInfo;
-    LOCALARENA *pArena, *pPrev, *pNext;
-
-    dprintf_local( stddeb, "LocalFreeArena: %04x ds=%04x\n", arena, ds );
-    if (!(pInfo = LOCAL_GetHeap( ds ))) return arena;
-
-    pArena = ARENA_PTR( ptr, arena );
-    if ((pArena->prev & 3) == LOCAL_ARENA_FREE)
-    {
-	/* shouldn't happen */
-        fprintf( stderr, "LocalFreeArena: Trying to free block %04x twice!\n",
-                 arena );
-	LOCAL_PrintHeap( ds );
-	return arena;
-    }
-
-      /* Check if we can merge with the previous block */
-
-    pPrev = ARENA_PTR( ptr, pArena->prev & ~3 );
-    pNext = ARENA_PTR( ptr, pArena->next );
-    if ((pPrev->prev & 3) == LOCAL_ARENA_FREE)
-    {
-        arena  = pArena->prev & ~3;
-        pArena = pPrev;
-        LOCAL_RemoveBlock( ptr, pPrev->next );
-        pInfo->items--;
-    }
-    else  /* Make a new free block */
-    {
-        LOCAL_MakeBlockFree( ptr, arena );
-    }
-
-      /* Check if we can merge with the next block */
-
-    if ((pArena->next == pArena->free_next) &&
-        (pArena->next != pInfo->last))
-    {
-        LOCAL_RemoveBlock( ptr, pArena->next );
-        pInfo->items--;
-    }
-    return 0;
+    return (HLOCAL16)((char *)pEntry - ptr);
 }
 
 
@@ -720,7 +862,7 @@
  *
  * Free a handle table entry.
  */
-static void LOCAL_FreeHandleEntry( WORD ds, HLOCAL handle )
+static void LOCAL_FreeHandleEntry( HANDLE16 ds, HLOCAL16 handle )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
@@ -754,16 +896,16 @@
 
     /* Now check if all entries in this table are free */
 
-    pEntry = (LOCALHANDLEENTRY *)(ptr + *pTable + sizeof(WORD));
-    count = *(WORD *)(ptr + *pTable);
+    table = *pTable;
+    pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
+    count = *(WORD *)(ptr + table);
     for (i = count; i > 0; i--, pEntry++) if (pEntry->lock != 0xff) return;
     
     /* Remove the table from the linked list and free it */
 
-    table = *pTable;
     dprintf_local( stddeb, "LOCAL_FreeHandleEntry(%04x): freeing table %04x\n",
                    ds, table);
-    *pTable = *((WORD *)(ptr + count * sizeof(*pEntry)) + 1);
+    *pTable = *(WORD *)pEntry;
     LOCAL_FreeArena( ds, ARENA_HEADER( table ) );
 }
 
@@ -773,7 +915,7 @@
  *
  * Implementation of LocalFree().
  */
-HLOCAL LOCAL_Free( HANDLE ds, HLOCAL handle )
+HLOCAL16 LOCAL_Free( HANDLE16 ds, HLOCAL16 handle )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
 
@@ -787,9 +929,14 @@
     }
     else
     {
-	WORD arena = ARENA_HEADER( *(WORD *)(ptr + handle) );
-        dprintf_local( stddeb, "LocalFree: real block at %04x\n", arena );
-        if (LOCAL_FreeArena( ds, arena )) return handle; /* couldn't free it */
+        LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
+        if (!(pEntry->flags & (LMEM_DISCARDED >> 8)))
+        {
+            dprintf_local( stddeb, "LocalFree: real block at %04x\n",
+			   pEntry->addr );
+            if (LOCAL_FreeArena( ds, ARENA_HEADER(pEntry->addr) ))
+                return handle; /* couldn't free it */
+        }
         LOCAL_FreeHandleEntry( ds, handle );
         return 0;  /* OK */
     }
@@ -801,17 +948,17 @@
  *
  * Implementation of LocalAlloc().
  */
-HLOCAL LOCAL_Alloc( HANDLE ds, WORD flags, WORD size )
+HLOCAL16 LOCAL_Alloc( HANDLE16 ds, WORD flags, WORD size )
 {
     char *ptr;
-    HLOCAL handle;
+    HLOCAL16 handle;
     
     dprintf_local( stddeb, "LocalAlloc: %04x %d ds=%04x\n", flags, size, ds );
 
     if (flags & LMEM_MOVEABLE)
     {
 	LOCALHANDLEENTRY *plhe;
-	HLOCAL hmem;
+	HLOCAL16 hmem;
 	
 	if (!(hmem = LOCAL_GetBlock( ds, size, flags ))) return 0;
 	if (!(handle = LOCAL_GetNewHandleEntry( ds )))
@@ -837,11 +984,12 @@
  *
  * Implementation of LocalReAlloc().
  */
-HLOCAL LOCAL_ReAlloc( HANDLE ds, HLOCAL handle, WORD size, WORD flags )
+HLOCAL16 LOCAL_ReAlloc( HANDLE16 ds, HLOCAL16 handle, WORD size, WORD flags )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo;
     LOCALARENA *pArena, *pNext;
+    LOCALHANDLEENTRY *pEntry;
     WORD arena, newhandle, blockhandle;
     LONG nextarena;
 
@@ -858,11 +1006,52 @@
     dprintf_local( stddeb, "LocalReAlloc: arena is %04x\n", arena );
     pArena = ARENA_PTR( ptr, arena );
     
-    if (flags & LMEM_MODIFY) {
-      dprintf_local( stddeb, "LMEM_MODIFY set\n");
-      return handle;
+    if ((flags & LMEM_MODIFY) && (flags & LMEM_DISCARDABLE))
+    {
+        if (HANDLE_FIXED(handle))
+        {
+            fprintf(stderr,"LocalReAlloc: LMEM_MODIFY & LMEM_DISCARDABLE on a fixed handle.\n");
+            return handle;
+        }
+        dprintf_local( stddeb, "Making block discardable.\n" );
+        pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
+        pEntry->flags |= (LMEM_DISCARDABLE >> 8);
+        return handle;
     }
-    if (!size) size = 1;
+
+    if ((flags & LMEM_MODIFY) || (flags & LMEM_DISCARDABLE))
+    {
+        fprintf(stderr,"LocalReAlloc: flags %04x. MODIFY & DISCARDABLE should both be set\n", flags);
+        return handle;
+    }
+
+    if (!size)
+    {
+        if (HANDLE_FIXED(handle))
+        {
+            if (flags & LMEM_MOVEABLE)
+            {
+                dprintf_local(stddeb, "Freeing fixed block.\n");
+                return LOCAL_Free( ds, handle );
+            }
+            else size = 1;
+        }
+        else
+        {
+            pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
+            if (pEntry->lock == 0)
+            {
+                /* discards moveable blocks is this right? */
+                dprintf_local(stddeb,"Discarding block\n");
+                LOCAL_FreeArena(ds, ARENA_HEADER(pEntry->addr));
+                pEntry->addr = 0;
+                pEntry->flags = (LMEM_DISCARDED >> 8);
+                return 0;
+            }
+            return handle;
+        }
+    }
+
     size = LALIGN( size );
     nextarena = LALIGN(blockhandle + size);
 
@@ -901,17 +1090,26 @@
         return handle;
     }
 
-      /* Now we have to allocate a new block */
+    /* Now we have to allocate a new block, but not if fixed block and no
+       LMEM_MOVEABLE */
 
-    newhandle = LOCAL_GetBlock( ds, size, flags );
-    if (newhandle == 0) return 0;
+    if (HANDLE_FIXED(handle) && !(flags & LMEM_MOVEABLE))
+    {
+        dprintf_local(stddeb, "Needed to move fixed block, but LMEM_MOVEABLE not specified.\n");
+        return 0;  /* FIXME: should we free it here? */
+    }
+
+    if (!(newhandle = LOCAL_GetBlock( ds, size, flags ))) return 0;
     ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     memcpy( ptr + newhandle, ptr + (arena + ARENA_HEADER_SIZE), size );
     LOCAL_FreeArena( ds, arena );
     if (HANDLE_MOVEABLE( handle ))
     {
 	dprintf_local( stddeb, "LocalReAlloc: fixing handle\n");
-	*(WORD *)(ptr + handle) = newhandle;
+        pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
+        pEntry->addr = newhandle;
+        pEntry->flags |= ~(LMEM_DISCARDED >> 8); /* clear discarded flag */
+        pEntry->lock = 0;
 	newhandle = handle;
     }
     dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", newhandle );
@@ -922,7 +1120,7 @@
 /***********************************************************************
  *           LOCAL_InternalLock
  */
-static HLOCAL LOCAL_InternalLock( LPSTR heap, HLOCAL handle )
+static HLOCAL16 LOCAL_InternalLock( LPSTR heap, HLOCAL16 handle )
 {
     dprintf_local( stddeb, "LocalLock: %04x ", handle );
     if (HANDLE_MOVEABLE(handle))
@@ -939,7 +1137,7 @@
 /***********************************************************************
  *           LOCAL_Lock
  */
-LPSTR LOCAL_Lock( HANDLE ds, HLOCAL handle )
+LPSTR LOCAL_Lock( HANDLE16 ds, HLOCAL16 handle )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     return handle ? ptr + LOCAL_InternalLock( ptr, handle ) : NULL;
@@ -949,7 +1147,7 @@
 /***********************************************************************
  *           LOCAL_Unlock
  */
-BOOL LOCAL_Unlock( WORD ds, HLOCAL handle )
+BOOL LOCAL_Unlock( HANDLE16 ds, HLOCAL16 handle )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
 
@@ -971,7 +1169,7 @@
  *
  * Implementation of LocalSize().
  */
-WORD LOCAL_Size( WORD ds, HLOCAL handle )
+WORD LOCAL_Size( HANDLE16 ds, HLOCAL16 handle )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( CURRENT_DS, 0 );
     LOCALARENA *pArena;
@@ -989,7 +1187,7 @@
  *
  * Implementation of LocalFlags().
  */
-WORD LOCAL_Flags( WORD ds, HLOCAL handle )
+WORD LOCAL_Flags( HANDLE16 ds, HLOCAL16 handle )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
 
@@ -1014,7 +1212,7 @@
  *
  * Implementation of LocalHeapSize().
  */
-WORD LOCAL_HeapSize( WORD ds )
+WORD LOCAL_HeapSize( HANDLE16 ds )
 {
     LOCALHEAPINFO *pInfo = LOCAL_GetHeap( ds );
     if (!pInfo) return 0;
@@ -1027,7 +1225,7 @@
  *
  * Implementation of LocalCountFree().
  */
-WORD LOCAL_CountFree( WORD ds )
+WORD LOCAL_CountFree( HANDLE16 ds )
 {
     WORD arena, total;
     LOCALARENA *pArena;
@@ -1061,7 +1259,7 @@
  *
  * Implementation of LocalHandle().
  */
-HLOCAL LOCAL_Handle( WORD ds, WORD addr )
+HLOCAL16 LOCAL_Handle( HANDLE16 ds, WORD addr )
 { 
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo;
@@ -1082,91 +1280,94 @@
         WORD count = *(WORD *)(ptr + table);
         LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY*)(ptr+table+sizeof(WORD));
         for (; count > 0; count--, pEntry++)
-            if (pEntry->addr == addr) return (HLOCAL)((char *)pEntry - ptr);
+            if (pEntry->addr == addr) return (HLOCAL16)((char *)pEntry - ptr);
         table = *(WORD *)pEntry;
     }
 
-    return (HLOCAL)addr;  /* Fixed block handle is addr */
+    return (HLOCAL16)addr;  /* Fixed block handle is addr */
 }
 
 
 /***********************************************************************
- *           LocalAlloc   (KERNEL.5)
+ *           LocalAlloc16   (KERNEL.5)
  */
-HLOCAL LocalAlloc( WORD flags, WORD size )
+HLOCAL16 LocalAlloc16( UINT16 flags, WORD size )
 {
     return LOCAL_Alloc( CURRENT_DS, flags, size );
 }
 
 
 /***********************************************************************
- *           LocalReAlloc   (KERNEL.6)
+ *           LocalReAlloc16   (KERNEL.6)
  */
-HLOCAL LocalReAlloc( HLOCAL handle, WORD size, WORD flags )
+HLOCAL16 LocalReAlloc16( HLOCAL16 handle, WORD size, UINT16 flags )
 {
     return LOCAL_ReAlloc( CURRENT_DS, handle, size, flags );
 }
 
 
 /***********************************************************************
- *           LocalFree   (KERNEL.7)
+ *           LocalFree16   (KERNEL.7)
  */
-HLOCAL LocalFree( HLOCAL handle )
+HLOCAL16 LocalFree16( HLOCAL16 handle )
 {
     return LOCAL_Free( CURRENT_DS, handle );
 }
 
 
 /***********************************************************************
- *           LocalLock   (KERNEL.8)
+ *           LocalLock16   (KERNEL.8)
+ *
+ * Note: only the offset part of the pointer is returned by the relay code.
  */
-NPVOID LocalLock( HLOCAL handle )
+SEGPTR LocalLock16( HLOCAL16 handle )
 {
-    char *ptr = PTR_SEG_OFF_TO_LIN( CURRENT_DS, 0 );
-    return (NPVOID)LOCAL_InternalLock( ptr, handle );
+    HANDLE16 ds = CURRENT_DS;
+    char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
+    return PTR_SEG_OFF_TO_SEGPTR( ds, LOCAL_InternalLock( ptr, handle ) );
 }
 
 
 /***********************************************************************
- *           LocalUnlock   (KERNEL.9)
+ *           LocalUnlock16   (KERNEL.9)
  */
-BOOL LocalUnlock( HLOCAL handle )
+BOOL LocalUnlock16( HLOCAL16 handle )
 {
     return LOCAL_Unlock( CURRENT_DS, handle );
 }
 
 
 /***********************************************************************
- *           LocalSize   (KERNEL.10)
+ *           LocalSize16   (KERNEL.10)
  */
-WORD LocalSize( HLOCAL handle )
+UINT16 LocalSize16( HLOCAL16 handle )
 {
     return LOCAL_Size( CURRENT_DS, handle );
 }
 
 
 /***********************************************************************
- *           LocalHandle   (KERNEL.11)
+ *           LocalHandle16   (KERNEL.11)
  */
-HLOCAL LocalHandle( WORD addr )
+HLOCAL16 LocalHandle16( WORD addr )
 { 
     return LOCAL_Handle( CURRENT_DS, addr );
 }
 
 
 /***********************************************************************
- *           LocalFlags   (KERNEL.12)
+ *           LocalFlags16   (KERNEL.12)
  */
-WORD LocalFlags( HLOCAL handle )
+UINT16 LocalFlags16( HLOCAL16 handle )
 {
     return LOCAL_Flags( CURRENT_DS, handle );
 }
 
 
 /***********************************************************************
- *           LocalCompact   (KERNEL.13)
+ *           LocalCompact16   (KERNEL.13)
  */
-WORD LocalCompact( WORD minfree )
+UINT16 LocalCompact16( UINT16 minfree )
 {
     dprintf_local( stddeb, "LocalCompact: %04x\n", minfree );
     return LOCAL_Compact( CURRENT_DS, minfree, 0 );
@@ -1180,7 +1381,7 @@
 {
     LOCALHEAPINFO *pInfo;
     FARPROC oldNotify;
-    WORD ds = CURRENT_DS;
+    HANDLE16 ds = CURRENT_DS;
 
     if (!(pInfo = LOCAL_GetHeap( ds )))
     {
@@ -1188,7 +1389,7 @@
 	LOCAL_PrintHeap( ds );
 	return 0;
     }
-    dprintf_local( stddeb, "LocalNotify(%04x): %08lx\n", ds, func );
+    dprintf_local( stddeb, "LocalNotify(%04x): %08lx\n", ds, (DWORD)func );
     oldNotify = pInfo->notify;
     pInfo->notify = func;
     return oldNotify;
@@ -1196,9 +1397,9 @@
 
 
 /***********************************************************************
- *           LocalShrink   (KERNEL.121)
+ *           LocalShrink16   (KERNEL.121)
  */
-WORD LocalShrink( HLOCAL handle, WORD newsize )
+UINT16 LocalShrink16( HGLOBAL16 handle, UINT16 newsize )
 {
     dprintf_local( stddeb, "LocalShrink: %04x %04x\n", handle, newsize );
     return 0;
@@ -1263,7 +1464,7 @@
  */
 BOOL LocalInfo( LOCALINFO *pLocalInfo, HGLOBAL handle )
 {
-    LOCALHEAPINFO *pInfo = LOCAL_GetHeap(SELECTOROF(WIN16_GlobalLock(handle)));
+    LOCALHEAPINFO *pInfo = LOCAL_GetHeap(SELECTOROF(WIN16_GlobalLock16(handle)));
     if (!pInfo) return FALSE;
     pLocalInfo->wcItems = pInfo->items;
     return TRUE;
@@ -1275,7 +1476,7 @@
  */
 BOOL LocalFirst( LOCALENTRY *pLocalEntry, HGLOBAL handle )
 {
-    WORD ds = SELECTOROF( WIN16_GlobalLock( handle ) );
+    WORD ds = SELECTOROF( WIN16_GlobalLock16( handle ) );
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo = LOCAL_GetHeap( ds );
     if (!pInfo) return FALSE;
@@ -1319,4 +1520,95 @@
     return TRUE;
 }
 
+#ifndef WINELIB
+
 #endif  /* WINELIB */
+
+/***********************************************************************
+ *           LocalAlloc32   (KERNEL32.371)
+ */
+HLOCAL32 LocalAlloc32( UINT32 flags, DWORD size )
+{
+    return (HLOCAL32)GlobalAlloc32( flags, size );
+}
+
+
+/***********************************************************************
+ *           LocalCompact32   (KERNEL32.372)
+ */
+UINT32 LocalCompact32( UINT32 minfree )
+{
+    return 0;  /* LocalCompact does nothing in Win32 */
+}
+
+
+/***********************************************************************
+ *           LocalFlags32   (KERNEL32.374)
+ */
+UINT32 LocalFlags32( HLOCAL32 handle )
+{
+    return GlobalFlags32( (HGLOBAL32)handle );
+}
+
+
+/***********************************************************************
+ *           LocalFree32   (KERNEL32.375)
+ */
+HLOCAL32 LocalFree32( HLOCAL32 handle )
+{
+    return (HLOCAL32)GlobalFree32( (HGLOBAL32)handle );
+}
+
+
+/***********************************************************************
+ *           LocalHandle32   (KERNEL32.376)
+ */
+HLOCAL32 LocalHandle32( LPCVOID ptr )
+{
+    return (HLOCAL32)GlobalHandle32( ptr );
+}
+
+
+/***********************************************************************
+ *           LocalLock32   (KERNEL32.377)
+ */
+LPVOID LocalLock32( HLOCAL32 handle )
+{
+    return GlobalLock32( (HGLOBAL32)handle );
+}
+
+
+/***********************************************************************
+ *           LocalReAlloc32   (KERNEL32.378)
+ */
+HLOCAL32 LocalReAlloc32( HLOCAL32 handle, DWORD size, UINT32 flags )
+{
+    return (HLOCAL32)GlobalReAlloc32( (HGLOBAL32)handle, size, flags );
+}
+
+
+/***********************************************************************
+ *           LocalShrink32   (KERNEL32.379)
+ */
+UINT32 LocalShrink32( HGLOBAL32 handle, UINT32 newsize )
+{
+    return 0;  /* LocalShrink does nothing in Win32 */
+}
+
+
+/***********************************************************************
+ *           LocalSize32   (KERNEL32.380)
+ */
+UINT32 LocalSize32( HLOCAL32 handle )
+{
+    return GlobalSize32( (HGLOBAL32)handle );
+}
+
+
+/***********************************************************************
+ *           LocalUnlock32   (KERNEL32.381)
+ */
+BOOL LocalUnlock32( HLOCAL32 handle )
+{
+    return GlobalUnlock32( (HGLOBAL32)handle );
+}
diff --git a/memory/selector.c b/memory/selector.c
index 6eef187..4b9e45a 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -4,8 +4,6 @@
  * Copyright 1995 Alexandre Julliard
  */
 
-#ifndef WINELIB
-
 #include <string.h>
 #include "windows.h"
 #include "ldt.h"
@@ -73,6 +71,7 @@
     dprintf_selector( stddeb, "FreeSelector(%04x)\n", sel );
     if (IS_SELECTOR_FREE(sel)) return sel;  /* error */
     count = (GET_SEL_LIMIT(sel) >> 16) + 1;
+    sel &= ~(__AHINCR - 1);  /* clear bottom bits of selector */
     nextsel = sel + (count << __AHSHIFT);
     memset( &entry, 0, sizeof(entry) );  /* clear the LDT entries */
     /* FIXME: is it correct to free the whole array? */
@@ -484,5 +483,3 @@
     return ((entry << 16) | ((unsigned) ptr & 0xffff));
 }
 #endif
-
-#endif  /* WINELIB */
diff --git a/misc/clipboard.c b/misc/clipboard.c
index 31049ba..bbac7a2 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -28,8 +28,7 @@
     DWORD	BufSize;
     void	*PrevFormat;
     void	*NextFormat;
-} CLIPFORMAT;
-typedef CLIPFORMAT FAR* LPCLIPFORMAT;
+} CLIPFORMAT, *LPCLIPFORMAT;
 
 static HWND hWndClipboardOwner = 0;
 static HWND hWndViewer = 0;
@@ -87,7 +86,7 @@
     while(TRUE) {
 	if (lpFormat == NULL) break;
 	if (lpFormat->hData != 0) {
-	    GlobalFree(lpFormat->hData);
+	    GlobalFree16(lpFormat->hData);
 	    lpFormat->hData = 0;
 	    }
 	lpFormat = lpFormat->NextFormat;
@@ -130,7 +129,7 @@
     XSetSelectionOwner(display,XA_PRIMARY,WIN_GetXWindow(hWndClipboardOwner),CurrentTime);
     wineOwnsSelection = True;
     dprintf_clipboard(stddeb,"Getting selection\n");
-    if (lpFormat->hData != 0) GlobalFree(lpFormat->hData);
+    if (lpFormat->hData != 0) GlobalFree16(lpFormat->hData);
     lpFormat->hData = hData;
     return lpFormat->hData;
 }
@@ -339,7 +338,7 @@
 /**************************************************************************
  *			GetPriorityClipboardFormat	[USER.402]
  */
-int GetPriorityClipboardFormat(WORD FAR *lpPriorityList, short nCount)
+int GetPriorityClipboardFormat(WORD *lpPriorityList, short nCount)
 {
     dprintf_clipboard(stdnimp,
 	"GetPriorityClipboardFormat(%p, %d) !\n", lpPriorityList, nCount);
@@ -377,9 +376,9 @@
 	    hText=0;
 	} else {
 	    dprintf_clipboard(stddeb,"Selection is %s\n",val);
-	    hText=GlobalAlloc(GMEM_MOVEABLE, nitems+1);
-	    memcpy(GlobalLock(hText),val,nitems+1);
-	    GlobalUnlock(hText);
+	    hText=GlobalAlloc16(GMEM_MOVEABLE, nitems+1);
+	    memcpy(GlobalLock16(hText),val,nitems+1);
+	    GlobalUnlock16(hText);
 	}
 	XFree(val);
     }
@@ -388,7 +387,7 @@
 	if (lpFormat->wFormatID == CF_TEXT) break;
 	lpFormat = lpFormat->NextFormat;
 	}
-    if (lpFormat->hData != 0) GlobalFree(lpFormat->hData);
+    if (lpFormat->hData != 0) GlobalFree16(lpFormat->hData);
     wait_for_selection=False;
     lpFormat->hData = hText;
     dprintf_clipboard(stddeb,"Received selection\n");
diff --git a/misc/comm.c b/misc/comm.c
index d863ec5..73811a9 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -426,7 +426,7 @@
 	}
 }  
 
-int GetCommError(int fd, COMSTAT FAR *lpStat)
+int GetCommError(int fd, COMSTAT *lpStat)
 {
 	int temperror;
 
@@ -437,7 +437,7 @@
 	return(temperror);
 }
 
-UINT FAR* SetCommEventMask(int fd, UINT fuEvtMask)
+UINT * SetCommEventMask(int fd, UINT fuEvtMask)
 {
     	dprintf_comm(stddeb,
 		"SetCommEventMask: fd %d, mask %d\n", fd, fuEvtMask);
@@ -453,7 +453,7 @@
 	return eventmask;
 }
 
-int SetCommState(DCB FAR *lpdcb)
+int SetCommState(DCB *lpdcb)
 {
 	struct termios port;
 	struct DosDeviceStruct *ptr;
@@ -652,7 +652,7 @@
 	}
 }
 
-int GetCommState(int fd, DCB FAR *lpdcb)
+int GetCommState(int fd, DCB *lpdcb)
 {
 	struct termios port;
 
diff --git a/misc/commdlg.c b/misc/commdlg.c
index a749ba2..0789843 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -28,6 +28,7 @@
 static	HBITMAP		hFloppy = 0;
 static	HBITMAP		hHDisk = 0;
 static	HBITMAP		hCDRom = 0;
+static  HBITMAP 	hBitmapTT = 0;
 
 /***********************************************************************
  * 				FileDlg_Init			[internal]
@@ -715,11 +716,11 @@
      */
     hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_FIND_TEXT );
     hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
-    if (!(ptr = (SEGPTR)WIN16_GlobalLock( hDlgTmpl ))) return -1;
+    if (!(ptr = (SEGPTR)WIN16_GlobalLock16( hDlgTmpl ))) return -1;
     bRet = CreateDialogIndirectParam( hInst, ptr, lpFind->hwndOwner,
                                       MODULE_GetWndProcEntry16("FindTextDlgProc"),
                                       (DWORD)lpFind );
-    GlobalUnlock( hDlgTmpl );
+    GlobalUnlock16( hDlgTmpl );
     SYSRES_FreeResource( hDlgTmpl );
     return bRet;
 }
@@ -744,11 +745,11 @@
      */
     hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_REPLACE_TEXT );
     hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
-    if (!(ptr = (SEGPTR)WIN16_GlobalLock( hDlgTmpl ))) return -1;
+    if (!(ptr = (SEGPTR)WIN16_GlobalLock16( hDlgTmpl ))) return -1;
     bRet = CreateDialogIndirectParam( hInst, ptr, lpFind->hwndOwner,
                                       MODULE_GetWndProcEntry16("ReplaceTextDlgProc"),
                                       (DWORD)lpFind );
-    GlobalUnlock( hDlgTmpl );
+    GlobalUnlock16( hDlgTmpl );
     SYSRES_FreeResource( hDlgTmpl );
     return bRet;
 }
@@ -2150,8 +2151,6 @@
 
 /***********************************************************************
  *                        ChooseFont   (COMMDLG.15)     
-     --April 1996--
-     please note: ChooseFont etc. are still under construction
  */
 BOOL ChooseFont(LPCHOOSEFONT lpChFont)
 {
@@ -2167,63 +2166,516 @@
     return bRet;
 }
 
-/***********************************************************************
- *           FontStyleEnumProc   (COMMDLG.18)
- */
-int FontStyleEnumProc(LOGFONT *lf ,TEXTMETRIC *tm, int fonttype, LPARAM lParam)
+
+#define TEXT_EXTRAS 4
+#define TEXT_COLORS 16
+
+static const COLORREF textcolors[TEXT_COLORS]=
 {
- dprintf_commdlg(stddeb,"FontStyleEnumProc: font=%s (height=%d)\n",lf->lfFaceName,lf->lfHeight);
- return 1;
+ 0x00000000L,0x00000080L,0x00008000L,0x00008080L,
+ 0x00800000L,0x00800080L,0x00808000L,0x00808080L,
+ 0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL,
+ 0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL
+};
+
+/***********************************************************************
+ *                          CFn_HookCallChk                 [internal]
+ */
+static BOOL CFn_HookCallChk(LPCHOOSEFONT lpcf)
+{
+ if (lpcf)
+  if(lpcf->Flags & CF_ENABLEHOOK)
+   if (lpcf->lpfnHook)
+    return TRUE;
+ return FALSE;
 }
 
 /***********************************************************************
- *           FontFamilyEnumProc   (COMMDLG.19)
+ *                FontFamilyEnumProc                       (COMMDLG.19)
  */
-int FontFamilyEnumProc(LOGFONT *lf ,TEXTMETRIC *tm, int fonttype, LPARAM lParam)
+int FontFamilyEnumProc(LPLOGFONT lplf ,LPTEXTMETRIC lptm, int nFontType, LPARAM lParam)
 {
- dprintf_commdlg(stddeb,"FontFamilyEnumProc: font=%s\n",lf->lfFaceName);
- return 1;
+  int i;
+  WORD w;
+  HWND hwnd=LOWORD(lParam);
+
+  dprintf_commdlg(stddeb,"FontFamilyEnumProc: font=%s (nFontType=%d)\n",
+     			lplf->lfFaceName,nFontType);
+  i=SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(lplf->lfFaceName));
+  if (i!=CB_ERR)
+  {
+    w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
+    SendMessage(hwnd, CB_SETITEMDATA,i,MAKELONG(nFontType,w));
+    return 1 ;
+  }
+  else
+    return 0;
 }
 
 /***********************************************************************
- *           ColorDlgProc   (COMMDLG.16)
+ *                 FontStyleEnumProc                     (COMMDLG.18)
  */
-LRESULT FormatCharDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
+int FontStyleEnumProc(LPLOGFONT lplf ,LPTEXTMETRIC lptm, int nFontType, LPARAM lParam)
+{
+  int j;
+  char buffer[20];
+/*  HWND hcmb2=LOWORD(lParam);*/
+  HWND hcmb3=HIWORD(lParam);
+  LPLOGFONT lf=lplf;
+
+  dprintf_commdlg(stddeb,"FontStyleEnumProc: (nFontType=%d)\n",nFontType);
+  dprintf_commdlg(stddeb,"  %s h=%d w=%d e=%d o=%d wg=%d i=%d u=%d s=%d ch=%d op=%d cp=%d q=%d pf=%xh\n",
+	lf->lfFaceName,lf->lfHeight,lf->lfWidth,lf->lfEscapement,lf->lfOrientation,
+	lf->lfWeight,lf->lfItalic,lf->lfUnderline,lf->lfStrikeOut,lf->lfCharSet,
+	lf->lfOutPrecision,lf->lfClipPrecision,lf->lfQuality,lf->lfPitchAndFamily);
+
+#if 1         /* VERSION A: use some predefined height values */                       
+  /* FIXME: if (!(nFontType & RASTER_FONTTYPE))......... */
+  {
+    int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};  
+    int i;
+    if (!SendMessage(hcmb3,CB_GETCOUNT,0,0)) 
+    {
+      i=0;
+      while (sizes[i])
+      {
+        sprintf(buffer,"%3d",sizes[i++]);
+        j=SendMessage(hcmb3,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(buffer));
+        SendMessage(hcmb3, CB_SETITEMDATA, j, MAKELONG(sizes[i],0));
+      }
+    }
+  }
+  return 0; 
+#endif
+
+#if 0        /* VERSION B: use only lplf->lfHeight values */
+  {
+    if (lplf->lfHeight)
+    {
+      sprintf(buffer,"%3d",lplf->lfHeight);
+      j=SendMessage(hcmb3,CB_FINDSTRING,-1,(LPARAM)MAKE_SEGPTR(buffer));
+      if (j==CB_ERR)
+      {
+       j=SendMessage(hcmb3,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(buffer));
+       SendMessage(hcmb3, CB_SETITEMDATA, j, MAKELONG(lplf->lfHeight,lplf->lfWidth));
+      } 
+    } 
+  }
+  return 1 ;
+#endif  
+
+}
+
+
+/***********************************************************************
+ *           CFn_WMInitDialog                            [internal]
+ */
+LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
   HDC hdc;
-  FARPROC  enumCallback;
-  
-  switch (wMsg) 
+  int i,j,res,init=0;
+  long l;
+  char buffer[32];
+  FARPROC enumCallback = MODULE_GetWndProcEntry16("FontFamilyEnumProc");
+  LPLOGFONT lpxx;
+  HCURSOR hcursor=SetCursor(LoadCursor(0,IDC_WAIT));
+  LPCHOOSEFONT lpcf;
+
+  SetWindowLong(hDlg, DWL_USER, lParam); 
+  lpcf=(LPCHOOSEFONT)lParam;
+  lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont);
+  dprintf_commdlg(stddeb,"FormatCharDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
+
+  if (lpcf->lStructSize != sizeof(CHOOSEFONT))
+  {
+    dprintf_commdlg(stddeb,"WM_INITDIALOG: structure size failure !!!\n");
+    EndDialog (hDlg, 0); 
+    return FALSE;
+  }
+  if (!hBitmapTT)
+    hBitmapTT = LoadBitmap(0, MAKEINTRESOURCE(OBM_TRTYPE));
+			 
+  if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow(lpcf->hwndOwner))
+    ShowWindow(GetDlgItem(hDlg,pshHelp),SW_HIDE);
+  if (!(lpcf->Flags & CF_APPLY))
+    ShowWindow(GetDlgItem(hDlg,psh3),SW_HIDE);
+  if (lpcf->Flags & CF_EFFECTS)
+  {
+    for (res=1,i=0;res && i<TEXT_COLORS;i++)
     {
-    case WM_INITDIALOG:
-      dprintf_commdlg(stddeb,"FormatCharDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
-      ShowWindow(hDlg, SW_SHOWNORMAL);
-      hdc = GetDC(hDlg);
-      if (hdc)
+      /* FIXME: load color name from resource:  res=LoadString(...,i+....,buffer,.....); */
+      j=SendDlgItemMessage(hDlg,cmb4,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR("[color name]"));
+      SendDlgItemMessage(hDlg,cmb4, CB_SETITEMDATA,j,textcolors[j]);
+      /* look for a fitting value in color combobox */
+      if (textcolors[j]==lpcf->rgbColors)
+        SendDlgItemMessage(hDlg,cmb4, CB_SETCURSEL,j,0);
+    }
+  }
+  else
+  {
+    ShowWindow(GetDlgItem(hDlg,cmb4),SW_HIDE);
+    ShowWindow(GetDlgItem(hDlg,chx1),SW_HIDE);
+    ShowWindow(GetDlgItem(hDlg,chx2),SW_HIDE);
+    ShowWindow(GetDlgItem(hDlg,grp1),SW_HIDE);
+    ShowWindow(GetDlgItem(hDlg,stc4),SW_HIDE);
+  }
+  
+  /* perhaps this stuff should be moved to FontStyleEnumProc() ?? */
+  strcpy(buffer,"Regular"); 	/* LoadString(hInst,.... ,buffer,LF_FACESIZE);*/
+  j=SendDlgItemMessage(hDlg,cmb2,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(buffer));
+  SendDlgItemMessage(hDlg,cmb2, CB_SETITEMDATA, j, MAKELONG(FW_NORMAL,0));
+  strcpy(buffer,"Bold");       	/* LoadString(hInst,.... ,buffer,LF_FACESIZE);*/
+  j=SendDlgItemMessage(hDlg,cmb2,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(buffer));
+  SendDlgItemMessage(hDlg,cmb2, CB_SETITEMDATA, j, MAKELONG(FW_BOLD,0));
+  strcpy(buffer,"Italic");	/* LoadString(hInst,.... ,buffer,LF_FACESIZE);*/
+  j=SendDlgItemMessage(hDlg,cmb2,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(buffer));
+  SendDlgItemMessage(hDlg,cmb2, CB_SETITEMDATA, j, MAKELONG(FW_NORMAL,1));
+  strcpy(buffer,"Bold Italic");	/* LoadString(hInst,.... ,buffer,LF_FACESIZE);*/
+  j=SendDlgItemMessage(hDlg,cmb2,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(buffer));
+  SendDlgItemMessage(hDlg,cmb2, CB_SETITEMDATA, j, MAKELONG(FW_BOLD,1));
+  
+  hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
+  if (hdc)
+  {
+    if (!EnumFontFamilies (hdc, NULL,enumCallback,(LPARAM)GetDlgItem(hDlg,cmb1)))
+      dprintf_commdlg(stddeb,"WM_INITDIALOG: EnumFontFamilies returns 0\n");
+    if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
+    {
+      /* look for fitting font name in combobox1 */
+      j=SendDlgItemMessage(hDlg,cmb1,CB_FINDSTRING,-1,(LONG)lpxx->lfFaceName);
+      if (j!=CB_ERR)
       {
-       HCURSOR hcursor=SetCursor(LoadCursor(0,IDC_WAIT));
-       /*  
-         currently only called for testing of 2 necessary EnumProcs 
-       */
-       enumCallback = MODULE_GetWndProcEntry16("FontFamilyEnumProc");
-       EnumFontFamilies (hdc, NULL,enumCallback ,NULL); 
-       enumCallback = MODULE_GetWndProcEntry16("FontStyleEnumProc");
-       EnumFontFamilies(hdc, /* for example : */ "COURIER",enumCallback,NULL);
-       ReleaseDC(hDlg,hdc);
-       SetCursor(hcursor);
+        SendDlgItemMessage(hDlg,cmb1,CB_SETCURSEL,j,0);
+	SendMessage(hDlg,WM_COMMAND,cmb1,MAKELONG(GetDlgItem(hDlg,cmb1),CBN_SELCHANGE));
+        init=1;
+        /* look for fitting font style in combobox2 */
+        l=MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:FW_NORMAL,lpxx->lfItalic !=0);
+        for (i=0;i<TEXT_EXTRAS;i++)
+        {
+          if (l==SendDlgItemMessage(hDlg,cmb2, CB_GETITEMDATA,i,0))
+            SendDlgItemMessage(hDlg,cmb2,CB_SETCURSEL,i,0);
+        }
+      
+        /* look for fitting font size in combobox3 */
+        j=SendDlgItemMessage(hDlg,cmb3,CB_GETCOUNT,0,0);
+        for (i=0;i<j;i++)
+        {
+          if (lpxx->lfHeight==(int)SendDlgItemMessage(hDlg,cmb3, CB_GETITEMDATA,i,0))
+            SendDlgItemMessage(hDlg,cmb3,CB_SETCURSEL,i,0);
+        }
       }
-      return (TRUE);
-    case WM_COMMAND:
-      switch (wParam)
-	{
-	case IDOK:
-	  EndDialog(hDlg, TRUE);
-	  return(TRUE);
-	case IDCANCEL:
-	  EndDialog(hDlg, FALSE);
-	  return(TRUE);
+      if (!init)
+      {
+        SendDlgItemMessage(hDlg,cmb1,CB_SETCURSEL,0,0);
+	SendMessage(hDlg,WM_COMMAND,cmb1,MAKELONG(GetDlgItem(hDlg,cmb1),CBN_SELCHANGE));      
+      }
+    }
+    if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
+    {
+      j=SendDlgItemMessage(hDlg,cmb2,CB_FINDSTRING,-1,(LONG)lpcf->lpszStyle);
+      if (j!=CB_ERR)
+      {
+        j=SendDlgItemMessage(hDlg,cmb2,CB_SETCURSEL,j,0);
+        SendMessage(hDlg,WM_COMMAND,cmb2,MAKELONG(GetDlgItem(hDlg,cmb2),CBN_SELCHANGE));
+      }
+    }
+  }
+  else
+  {
+    dprintf_commdlg(stddeb,"WM_INITDIALOG: HDC failure !!!\n");
+    EndDialog (hDlg, 0); 
+    return FALSE;
+  }
+
+  if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
+    ReleaseDC(hDlg,hdc);
+  res=TRUE;
+  if (CFn_HookCallChk(lpcf))
+    res=CallWindowProc(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+  SetCursor(hcursor);   
+  return res;
+}
+
+
+/***********************************************************************
+ *           CFn_WMMeasureItem                           [internal]
+ */
+LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
+{
+  BITMAP bm;
+  LPMEASUREITEMSTRUCT lpmi=PTR_SEG_TO_LIN((LPMEASUREITEMSTRUCT)lParam);
+  if (!hBitmapTT)
+    hBitmapTT = LoadBitmap(0, MAKEINTRESOURCE(OBM_TRTYPE));
+  GetObject(hBitmapTT, sizeof(BITMAP), (LPSTR)&bm);
+  lpmi->itemHeight=bm.bmHeight;
+  /* FIXME: use MAX of bm.bmHeight and tm.tmHeight .*/
+  return 0;
+}
+
+
+/***********************************************************************
+ *           CFn_WMDrawItem                              [internal]
+ */
+LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
+{
+  HBRUSH hBrush;
+  char buffer[40];
+  BITMAP bm;
+  COLORREF cr;
+  RECT rect;
+#if 0  
+  HDC hMemDC;
+  int nFontType;
+  HBITMAP hBitmap; /* for later TT usage */
+#endif  
+  LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)PTR_SEG_TO_LIN(lParam);
+
+  if (lpdi->itemID == 0xFFFF) 			/* got no items */
+    DrawFocusRect(lpdi->hDC, &lpdi->rcItem);
+  else
+  {
+   if (lpdi->CtlType == ODT_COMBOBOX)
+   {
+     hBrush = SelectObject(lpdi->hDC, GetStockObject(LTGRAY_BRUSH));
+     SelectObject(lpdi->hDC, hBrush);
+     FillRect(lpdi->hDC, &lpdi->rcItem, hBrush);
+   }
+   else
+     return TRUE;	/* this should never happen */
+
+   rect=lpdi->rcItem;
+   switch (lpdi->CtlID)
+   {
+    case cmb1:	/* dprintf_commdlg(stddeb,"WM_Drawitem cmb1\n"); */
+		SendMessage(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+			(LPARAM)MAKE_SEGPTR(buffer));	          
+		GetObject(hBitmapTT, sizeof(BITMAP), (LPSTR)&bm);
+		TextOut(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
+			lpdi->rcItem.top, buffer, lstrlen(buffer));
+#if 0
+		nFontType = SendMessage(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
+		  /* FIXME: draw bitmap if truetype usage */
+		if (nFontType&TRUETYPE_FONTTYPE)
+		{
+		  hMemDC = CreateCompatibleDC(lpdi->hDC);
+		  hBitmap = SelectObject(hMemDC, hBitmapTT);
+		  BitBlt(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top,
+			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+		  SelectObject(hMemDC, hBitmap);
+		  DeleteDC(hMemDC);
+		}
+#endif
+		break;
+    case cmb2:
+    case cmb3:	/* dprintf_commdlg(stddeb,"WM_DRAWITEN cmb2,cmb3\n"); */
+		SendMessage(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+			(LPARAM)MAKE_SEGPTR(buffer));
+		TextOut(lpdi->hDC, lpdi->rcItem.left,
+			lpdi->rcItem.top, buffer, lstrlen(buffer));
+		break;
+
+    case cmb4:	/* dprintf_commdlg(stddeb,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
+		SendMessage(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+    		    (LPARAM)MAKE_SEGPTR(buffer));
+		TextOut(lpdi->hDC, lpdi->rcItem.left +  25+5,
+			lpdi->rcItem.top, buffer, lstrlen(buffer));
+		cr = SendMessage(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
+		hBrush = CreateSolidBrush(cr);
+		if (hBrush)
+		{
+		  hBrush = SelectObject (lpdi->hDC, hBrush) ;
+		  rect.right=rect.left+25;
+		  rect.top++;
+		  rect.left+=5;
+		  rect.bottom--;
+		  Rectangle(lpdi->hDC,rect.left,rect.top,rect.right,rect.bottom);
+		  DeleteObject (SelectObject (lpdi->hDC, hBrush)) ;
+		}
+		rect=lpdi->rcItem;
+		rect.left+=25+5;
+		break;
+
+    default:	return TRUE;	/* this should never happen */
+   }
+   if (lpdi->itemState ==ODS_SELECTED)
+     InvertRect(lpdi->hDC, &rect);
+ }
+ return TRUE;
+}
+
+/***********************************************************************
+ *           CFn_WMCtlColor                              [internal]
+ */
+LRESULT CFn_WMCtlColor(HWND hDlg, WPARAM wParam, LPARAM lParam)
+{
+  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER); 
+
+  if (lpcf->Flags & CF_EFFECTS)
+   if (HIWORD(lParam)==CTLCOLOR_STATIC && GetDlgCtrlID(LOWORD(lParam))==stc6)
+   {
+     SetTextColor(wParam,lpcf->rgbColors);
+     return GetStockObject(WHITE_BRUSH);
+   }
+  return 0;
+}
+
+/***********************************************************************
+ *           CFn_WMCommand                               [internal]
+ */
+LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
+{
+  char buffer[200];
+  FARPROC enumCallback;
+  HFONT hFont/*,hFontOld*/;
+  int i,j;
+  long l;
+  HDC hdc;
+  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER); 
+  LPLOGFONT lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont);
+  
+  dprintf_commdlg(stddeb,"FormatCharDlgProc // WM_COMMAND lParam=%08lX\n", lParam);
+  switch (wParam)
+  {
+	case cmb1:if (HIWORD(lParam)==CBN_SELCHANGE)
+		  {
+		    hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC(hDlg);
+		    if (hdc)
+		    {
+		      /* only if cmb2 is refilled in  FontStyleEnumProc():
+       		                 SendDlgItemMessage(hDlg,cmb2,CB_RESETCONTENT,0,0); 
+		       */
+		      SendDlgItemMessage(hDlg,cmb3,CB_RESETCONTENT,0,0);
+		      i=SendDlgItemMessage(hDlg,cmb1,CB_GETCURSEL,0,0);
+		      if (i!=CB_ERR)
+		      {
+		        HCURSOR hcursor=SetCursor(LoadCursor(0,IDC_WAIT));
+                        SendDlgItemMessage(hDlg,cmb1,CB_GETLBTEXT,i,(LPARAM)MAKE_SEGPTR(buffer));
+	                dprintf_commdlg(stddeb,"WM_COMMAND/cmb1 =>%s\n",buffer);
+		        enumCallback = MODULE_GetWndProcEntry16("FontStyleEnumProc");
+       		        EnumFontFamilies(hdc,buffer,enumCallback,
+		             MAKELONG(GetDlgItem(hDlg,cmb2),GetDlgItem(hDlg,cmb3)));
+		        SetCursor(hcursor);        
+		      }
+		      if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
+ 		        ReleaseDC(hDlg,hdc);
+ 		    }
+ 		    else
+                    {
+                      dprintf_commdlg(stddeb,"WM_COMMAND: HDC failure !!!\n");
+                      EndDialog (hDlg, 0); 
+                      return TRUE;
+                    }
+	          }
+	case chx1:
+	case chx2:
+	case cmb2:
+	case cmb3:if (HIWORD(lParam)==CBN_SELCHANGE || HIWORD(lParam)== BN_CLICKED )
+	          {
+                    dprintf_commdlg(stddeb,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
+		    i=SendDlgItemMessage(hDlg,cmb1,CB_GETCURSEL,0,0);
+		    if (i==CB_ERR)
+                      i=SendDlgItemMessage(hDlg,cmb1,WM_GETTEXT,20,(LPARAM)MAKE_SEGPTR(buffer));
+                    else
+                    {
+		      SendDlgItemMessage(hDlg,cmb1,CB_GETLBTEXT,i,(LPARAM)MAKE_SEGPTR(buffer));
+		      l=SendDlgItemMessage(hDlg,cmb1,CB_GETITEMDATA,i,0);
+		      j=HIWORD(l);
+		      lpcf->nFontType = LOWORD(l);
+		      /* FIXME:   lpcf->nFontType |= ....  SIMULATED_FONTTYPE and so */
+		      /* same value reported to the EnumFonts
+		       call back with the extra FONTTYPE_...  bits added */
+		      lpxx->lfPitchAndFamily=j&0xff;
+		      lpxx->lfCharSet=j>>8;
+                    }
+                    strcpy(lpxx->lfFaceName,buffer);
+		    i=SendDlgItemMessage(hDlg,cmb2,CB_GETCURSEL,0,0);
+		    if (i!=CB_ERR)
+		    {
+		      l=SendDlgItemMessage(hDlg,cmb2,CB_GETITEMDATA,i,0);
+		      if (0!=(lpxx->lfItalic=HIWORD(l)))
+		        lpcf->nFontType |= ITALIC_FONTTYPE;
+		      if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
+		        lpcf->nFontType |= BOLD_FONTTYPE;
+		    }
+		    i=SendDlgItemMessage(hDlg,cmb3,CB_GETCURSEL,0,0);
+		    if (i!=CB_ERR)
+		    {
+		      l=SendDlgItemMessage(hDlg,cmb3,CB_GETITEMDATA,i,0);
+		      lpxx->lfHeight=-LOWORD(l);
+		      lpxx->lfWidth = 0;  /* FYI: lfWidth is in HIWORD(l); */
+		    }
+		    lpxx->lfStrikeOut=IsDlgButtonChecked(hDlg,chx1);
+		    lpxx->lfUnderline=IsDlgButtonChecked(hDlg,chx2);
+		    lpxx->lfOrientation=lpxx->lfEscapement=0;
+		    lpxx->lfOutPrecision=OUT_DEFAULT_PRECIS;
+		    lpxx->lfClipPrecision=CLIP_DEFAULT_PRECIS;
+		    lpxx->lfQuality=DEFAULT_QUALITY;
+
+		    hFont=CreateFontIndirect(lpxx);
+		    if (hFont)
+		      SendDlgItemMessage(hDlg,stc6,WM_SETFONT,hFont,TRUE);
+		    /* FIXME: Delete old font ...? */  
+                  }
+                  break;
+
+	case cmb4:i=SendDlgItemMessage(hDlg,cmb4,CB_GETCURSEL,0,0);
+		  if (i!=CB_ERR)
+		  {
+		   lpcf->rgbColors=textcolors[i];
+		   InvalidateRect(GetDlgItem(hDlg,stc6),NULL,0);
+		  }
+		  break;
+	
+	case psh15:i=RegisterWindowMessage(MAKE_SEGPTR(HELPMSGSTRING));
+		  if (lpcf->hwndOwner)
+		    SendMessage(lpcf->hwndOwner,i,0,(LPARAM)lpcf);
+		  if (CFn_HookCallChk(lpcf))
+		    CallWindowProc(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);
+		  break;
+
+	case IDOK:EndDialog(hDlg, TRUE);
+		  return(TRUE);
+	case IDCANCEL:EndDialog(hDlg, FALSE);
+		  return(TRUE);
 	}
       return(FALSE);
+}
+
+
+/***********************************************************************
+ *           FormatCharDlgProc   (COMMDLG.16)
+             FIXME: 1. some strings are "hardcoded", but it's better load from sysres
+                    2. some CF_.. flags are not supported
+                    3. some TType extensions
+ */
+LRESULT FormatCharDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER);  
+  if (message!=WM_INITDIALOG)
+  {
+   int res=0;
+   if (!lpcf)
+      return FALSE;
+   if (CFn_HookCallChk(lpcf))
+     res=CallWindowProc(lpcf->lpfnHook,hDlg,message,wParam,lParam);
+   if (res)
+    return res;
+  }
+  else
+    return CFn_WMInitDialog(hDlg,wParam,lParam);
+  switch (message)
+    {
+      case WM_MEASUREITEM:
+                        return CFn_WMMeasureItem(hDlg,wParam,lParam);
+      case WM_DRAWITEM:
+                        return CFn_WMDrawItem(hDlg,wParam,lParam);
+      case WM_CTLCOLOR:
+                        return CFn_WMCtlColor(hDlg,wParam,lParam);
+      case WM_COMMAND:
+                        return CFn_WMCommand(hDlg,wParam,lParam);
+      case WM_CHOOSEFONT_GETLOGFONT: 
+                        /* FIXME:  current logfont back to caller */
+                        break;
     }
   return FALSE;
 }
diff --git a/misc/compobj.c b/misc/compobj.c
index 026b681..106aaed 100644
--- a/misc/compobj.c
+++ b/misc/compobj.c
@@ -19,7 +19,7 @@
 /***********************************************************************
  *           CoBuildVersion [COMPOBJ.1]
  */
-DWORD WINAPI CoBuildVersion()
+DWORD CoBuildVersion()
 {
 	dprintf_ole(stddeb,"CoBuildVersion()\n");
 	return (rmm<<16)+rup;
@@ -29,7 +29,7 @@
  *           CoInitialize	[COMPOBJ.2]
  * lpReserved is an IMalloc pointer in 16bit OLE. We just stored it as-is.
  */
-HRESULT WINAPI CoInitialize(DWORD lpReserved)
+HRESULT CoInitialize(DWORD lpReserved)
 {
 	dprintf_ole(stdnimp,"CoInitialize\n");
 	/* remember the LPMALLOC, maybe somebody wants to read it later on */
@@ -48,7 +48,7 @@
 /***********************************************************************
  *           CoGetMalloc    [COMPOBJ.4]
  */
-HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, DWORD * lpMalloc)
+HRESULT CoGetMalloc(DWORD dwMemContext, DWORD * lpMalloc)
 {
 	if(currentMalloc)
 	{
@@ -63,9 +63,7 @@
 /***********************************************************************
  *           CoDisconnectObject
  */
-OLESTATUS WINAPI CoDisconnectObject(
-	LPUNKNOWN lpUnk,
-	DWORD reserved)
+OLESTATUS CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved )
 {
     dprintf_ole(stdnimp,"CoDisconnectObject:%p %lx\n",lpUnk,reserved);
     return OLE_OK;
diff --git a/misc/driver.c b/misc/driver.c
index 7f9f951..eb51ba9 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -41,7 +41,7 @@
 /**************************************************************************
  *				SendDriverMessage		[USER.251]
  */
-LRESULT WINAPI SendDriverMessage(HDRVR hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2)
+LRESULT SendDriverMessage(HDRVR hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2)
 {
 	dprintf_driver(stdnimp,"SendDriverMessage(%04x, %04X, %08lX, %08lX);\n",
 						hDriver, msg, lParam1, lParam2);
@@ -68,8 +68,8 @@
 		if (lpdrv->lpNextItem == NULL) break;
 		lpdrv = lpdrv->lpNextItem;
 		}
-	hDrvr = GlobalAlloc(GMEM_MOVEABLE, sizeof(DRIVERITEM));
-	lpnewdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
+	hDrvr = GlobalAlloc16(GMEM_MOVEABLE, sizeof(DRIVERITEM));
+	lpnewdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
 	if (lpnewdrv == NULL) return 0;
 	lpnewdrv->dis.length = sizeof(DRIVERINFOSTRUCT);
 	lpnewdrv->dis.hModule = 0;
@@ -91,7 +91,7 @@
 		lpdrv->lpNextItem = lpnewdrv;
 		lpnewdrv->lpPrevItem = lpdrv;
 		}
-	lpnewdrv->lpDrvProc = NULL;
+	lpnewdrv->lpDrvProc = (DRIVERPROC)NULL;
     	dprintf_driver(stddeb,"OpenDriver // hDrvr=%04x loaded !\n", hDrvr);
 	return hDrvr;
 }
@@ -104,14 +104,14 @@
 	LPDRIVERITEM	lpdrv;
     	dprintf_driver(stddeb,
 		"CloseDriver(%04x, %08lX, %08lX);\n", hDrvr, lParam1, lParam2);
-	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
+	lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
 	if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr) {
 		if (lpdrv->lpPrevItem)
 			((LPDRIVERITEM)lpdrv->lpPrevItem)->lpNextItem = lpdrv->lpNextItem;
 		if (lpdrv->lpNextItem)
 			((LPDRIVERITEM)lpdrv->lpNextItem)->lpPrevItem = lpdrv->lpPrevItem;
-		GlobalUnlock(hDrvr);
-		GlobalFree(hDrvr);
+		GlobalUnlock16(hDrvr);
+		GlobalFree16(hDrvr);
         dprintf_driver(stddeb,"CloseDriver // hDrvr=%04x closed !\n", hDrvr);
 		return TRUE;
 		}
@@ -126,10 +126,10 @@
 	LPDRIVERITEM	lpdrv;
 	HANDLE			hModule = 0;
     	dprintf_driver(stddeb,"GetDriverModuleHandle(%04x);\n", hDrvr);
-	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
+	lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
 	if (lpdrv != NULL) {
 		hModule = lpdrv->dis.hModule;
-		GlobalUnlock(hDrvr);
+		GlobalUnlock16(hDrvr);
 		}
 	return hModule;
 }
@@ -176,10 +176,10 @@
 	LPDRIVERITEM	lpdrv;
     	dprintf_driver(stddeb,"GetDriverInfo(%04x, %p);\n", hDrvr, lpDrvInfo);
 	if (lpDrvInfo == NULL) return FALSE;
-	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
+	lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
 	if (lpdrv == NULL) return FALSE;
 	memcpy(lpDrvInfo, &lpdrv->dis, sizeof(DRIVERINFOSTRUCT));
-	GlobalUnlock(hDrvr);
+	GlobalUnlock16(hDrvr);
 	return TRUE;
 }
 
@@ -202,7 +202,7 @@
 					lpDrvItemList->dis.hDriver);
 		return lpDrvItemList->dis.hDriver;
 		}
-	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
+	lpdrv = (LPDRIVERITEM) GlobalLock16(hDrvr);
 	if (lpdrv != NULL) {
 		if (dwFlags & GND_REVERSE) {
 			if (lpdrv->lpPrevItem) 
@@ -212,7 +212,7 @@
 			if (lpdrv->lpNextItem) 
 				hRetDrv = ((LPDRIVERITEM)lpdrv->lpNextItem)->dis.hDriver;
 			}
-		GlobalUnlock(hDrvr);
+		GlobalUnlock16(hDrvr);
 		}
     	dprintf_driver(stddeb,"GetNextDriver // return %04x !\n", hRetDrv);
 	return hRetDrv;
diff --git a/misc/exec.c b/misc/exec.c
index 085bb86..ad53f6b 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -165,8 +165,8 @@
 	else
 		nlen = 0;
 	size = sizeof(WINHELP) + nlen + dsize;
-	hwh = GlobalAlloc(0,size);
-	lpwh = GlobalLock(hwh);
+	hwh = GlobalAlloc16(0,size);
+	lpwh = GlobalLock16(hwh);
 	lpwh->size = size;
 	lpwh->command = wCommand;
 	if(nlen) {
@@ -178,6 +178,6 @@
 		lpwh->ofsData = sizeof(WINHELP)+nlen;
 	} else
 		lpwh->ofsData = 0;
-	GlobalUnlock(hwh);
+	GlobalUnlock16(hwh);
 	return SendMessage(hDest,WM_WINHELP,hWnd,hwh);
 }
diff --git a/misc/lstr.c b/misc/lstr.c
index b806061..5ebd79c 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -5,14 +5,18 @@
  */
 
 #include <stdio.h>
+#include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 
-#include "ldt.h"
 #include "windows.h"
+#include "ldt.h"
+#include "module.h"
+#include "stackframe.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 #define ToUpper(c)	toupper(c)
 #define ToLower(c)	tolower(c)
@@ -315,3 +319,127 @@
   for(i=0;i<nLength;i++)
     lpAnsiStr[i]=Oem2Ansi[(unsigned char)(lpOemStr[i])];
 }
+
+
+/***********************************************************************
+ *           OutputDebugString   (KERNEL.115)
+ */
+void OutputDebugString( LPCSTR str )
+{
+    char *module;
+    char *p, *buffer = xmalloc( strlen(str)+1 );
+    /* Remove CRs */
+    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()) );
+    fprintf( stderr, "OutputDebugString: %s says '%s'\n",
+             module ? module : "???", buffer );
+             
+}
+
+
+/***********************************************************************
+ *           wsprintf   (USER.420)
+ */
+#ifndef WINELIB
+int wsprintf( LPSTR dummy1, LPSTR dummy2, ... )
+{
+    LPSTR lpOutput, lpFormat;
+    DWORD *win_stack = (DWORD *)CURRENT_STACK16->args;
+
+    lpOutput = (LPSTR) PTR_SEG_TO_LIN(*win_stack);
+    win_stack++;
+    lpFormat = (LPSTR) PTR_SEG_TO_LIN(*win_stack);
+    win_stack++;
+
+    return wvsprintf( lpOutput, lpFormat, (LPCSTR)win_stack );
+}
+#else  /* WINELIB */
+int wsprintf(LPSTR lpOutput, LPSTR lpFormat, ...)
+{
+    va_list valist;
+    int ArgCnt;
+
+    va_start(valist, lpFormat);
+    ArgCnt = vsprintf(lpOutput, lpFormat, valist);
+    va_end(valist);
+
+    return ArgCnt;
+}
+#endif  /* WINELIB */
+
+
+/***********************************************************************
+ *           wvsprintf   (USER.421)
+ */
+int wvsprintf( LPSTR buf, LPCSTR format, LPCSTR args )
+{
+    LPCSTR ptr;
+    DWORD stack[512], *stack_ptr;
+    BOOL fLarge;
+
+    /* Create the 32-bit stack for libc's vsprintf() */
+
+    for (stack_ptr = stack, ptr = format; *ptr; ptr++)
+    {
+        if (*ptr != '%' || *++ptr == '%')
+            continue;
+
+        /* skip width/precision */
+        while (*ptr == '-' || *ptr == '+' || *ptr == '.' ||
+               *ptr == ' ' || isdigit(*ptr) || *ptr == '#')
+            ptr++;
+
+        /* handle modifier */
+        fLarge = ((*ptr == 'l') || (*ptr == 'L'));
+        if (fLarge) ptr++;
+
+        switch (*ptr)
+        {
+        case 's':
+            *stack_ptr++ = (DWORD)PTR_SEG_TO_LIN(*(DWORD*)args);
+            args += sizeof(DWORD);
+            break;
+
+        case 'c':
+/* windows' wsprintf() %c ignores 0's, we replace 0 with SPACE to make sure
+   that the remaining part of the string isn't ignored by the winapp */
+            *stack_ptr++ = (DWORD)(*(WORD*)args ? *(WORD*)args : ' ');
+            args += sizeof(WORD);
+            break;
+
+        case 'd':
+        case 'i':
+            if (!fLarge)
+            {
+                *stack_ptr++ = (DWORD)(INT32)(*(INT16 *)args);
+                args += sizeof(INT16);
+                break;
+            }
+            /* else fall through */
+        case 'u':
+        case 'x':
+        case 'X':
+            if (fLarge)
+            {
+                *stack_ptr++ = *(DWORD*)args;
+                args += sizeof(DWORD);
+            }
+            else
+            {
+                *stack_ptr++ = *(WORD*)args;
+                args += sizeof(WORD);
+            }
+            break;
+
+        default:
+            *stack_ptr++ = 0;
+            args += sizeof(WORD);
+            fprintf( stderr, "wsprintf: oops, unknown format %c!\n", *ptr );
+            break;
+        }
+    }
+
+    return vsprintf( buf, format, stack );
+}
diff --git a/misc/main.c b/misc/main.c
index 2cb0af4..233e7ed 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -1044,7 +1044,7 @@
 /***********************************************************************
 *	GetWinDebugInfo (KERNEL.355)
 */
-BOOL GetWinDebugInfo(WINDEBUGINFO FAR* lpwdi, UINT flags)
+BOOL GetWinDebugInfo(WINDEBUGINFO *lpwdi, UINT flags)
 {
 	printf("GetWinDebugInfo(%8lx,%d) stub returning 0\n", (unsigned long)lpwdi, flags);
 	/* 0 means not in debugging mode/version */
@@ -1056,7 +1056,7 @@
 /***********************************************************************
 *	GetWinDebugInfo (KERNEL.355)
 */
-BOOL SetWinDebugInfo(WINDEBUGINFO FAR* lpwdi)
+BOOL SetWinDebugInfo(WINDEBUGINFO *lpwdi)
 {
 	printf("SetWinDebugInfo(%8lx) stub returning 0\n", (unsigned long)lpwdi);
 	/* 0 means not in debugging mode/version */
diff --git a/misc/network.c b/misc/network.c
index 0713f8d..65ef9cb 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -154,7 +154,7 @@
  *				WNetGetConnection	[USER.512]
  */
 int WNetGetConnection(LPSTR lpLocalName, 
-	LPSTR lpRemoteName, UINT FAR *cbRemoteName)
+	LPSTR lpRemoteName, UINT *cbRemoteName)
 {
     const char *path;
 
@@ -393,7 +393,7 @@
  *				WNetOpenEnum		[USER.???]
  */
 UINT WNetOpenEnum(DWORD dwScope, DWORD dwType, 
-	LPNETRESOURCE lpNet, HANDLE FAR *lphEnum)
+	LPNETRESOURCE lpNet, HANDLE *lphEnum)
 {
 	printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n",
                dwScope, dwType, lpNet, lphEnum);
diff --git a/misc/ole2.c b/misc/ole2.c
index e5ae3c7..3ca5010 100644
--- a/misc/ole2.c
+++ b/misc/ole2.c
@@ -24,7 +24,7 @@
 /***********************************************************************
  *           OleInitialize       [OLE2.2]
  */
-HRESULT WINAPI OleInitialize(LPVOID reserved)
+HRESULT OleInitialize(LPVOID reserved)
 {
     dprintf_ole(stdnimp,"OleInitialize\n");
 	return S_OK;
@@ -33,7 +33,7 @@
 /***********************************************************************
  *           OleUnitialize       [OLE2.3]
  */
-void WINAPI OleUninitialize()
+void OleUninitialize()
 {
 	dprintf_ole(stdnimp,"OleUninitialize()\n");
 }
diff --git a/misc/ole2disp.c b/misc/ole2disp.c
index edb461c..e738adc 100644
--- a/misc/ole2disp.c
+++ b/misc/ole2disp.c
@@ -22,10 +22,10 @@
 
 static BSTR BSTR_AllocBytes(int n)
 {
-	HLOCAL mem;
+	HLOCAL16 mem;
 	if(!BSTRheapsel)
 	{
-		BSTRheapsel=GlobalAlloc(GMEM_FIXED,BSTR_HEAP_SIZE);
+		BSTRheapsel=GlobalAlloc16(GMEM_FIXED,BSTR_HEAP_SIZE);
 		LocalInit(BSTRheapsel,0,BSTR_HEAP_SIZE-1);
 	}
 	if(!BSTRheapsel)
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index 72e5bee..3f120a5 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -18,7 +18,7 @@
 /***********************************************************************
  *           GetUserDefaultLCID       (OLE2NLS.1)
  */
-DWORD WINAPI GetUserDefaultLCID()
+DWORD GetUserDefaultLCID()
 {
 /* Default sorting, neutral sublanguage */
     switch(Options.language)
@@ -42,7 +42,7 @@
 /***********************************************************************
  *         GetSystemDefaultLCID       (OLE2NLS.2)
  */
-DWORD WINAPI GetSystemDefaultLCID()
+DWORD GetSystemDefaultLCID()
 {
 	return GetUserDefaultLCID();
 }
@@ -50,7 +50,7 @@
 /***********************************************************************
  *         GetUserDefaultLangID       (OLE2NLS.3)
  */
-WORD WINAPI GetUserDefaultLangID()
+WORD GetUserDefaultLangID()
 {
 	return (WORD)GetUserDefaultLCID();
 }
@@ -58,7 +58,7 @@
 /***********************************************************************
  *         GetSystemDefaultLangID     (OLE2NLS.4)
  */
-WORD WINAPI GetSystemDefaultLangID()
+WORD GetSystemDefaultLangID()
 {
 	return GetUserDefaultLangID();
 }
@@ -67,7 +67,7 @@
  *         GetLocaleInfoA             (OLE2NLS.5)
  * Is the last parameter really WORD for Win16?
  */
-int WINAPI GetLocaleInfoA(DWORD lcid,DWORD LCType,LPSTR buf,WORD len)
+int GetLocaleInfoA(DWORD lcid,DWORD LCType,LPSTR buf,WORD len)
 {
 	char *retString;
     int retLen;
diff --git a/misc/olecli.c b/misc/olecli.c
index adf9a72..7e53656 100644
--- a/misc/olecli.c
+++ b/misc/olecli.c
@@ -18,11 +18,8 @@
 /***********************************************************************
  *           OleRegisterClientDoc
  */
-OLESTATUS WINAPI OleRegisterClientDoc(
-	LPCSTR classname,
-	LPCSTR docname,
-	LONG reserved,
-	LHCLIENTDOC FAR *hRet)
+OLESTATUS OleRegisterClientDoc(	LPCSTR classname, LPCSTR docname,
+                                LONG reserved, LHCLIENTDOC *hRet )
 {
     dprintf_ole(stdnimp,"OleRegisterClientDoc:%s %s\n",classname,docname);
     *hRet=++OLE_current_handle;
@@ -32,7 +29,7 @@
 /***********************************************************************
  *           OleRenameClientDoc
  */
-OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC hDoc, LPCSTR newName)
+OLESTATUS OleRenameClientDoc(LHCLIENTDOC hDoc, LPCSTR newName)
 {
     dprintf_ole(stdnimp,"OleRenameClientDoc: %ld %s\n",hDoc, newName);
     return OLE_OK;
@@ -41,7 +38,7 @@
 /***********************************************************************
  *           OleRevokeClientDoc
  */
-OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC hServerDoc)
+OLESTATUS OleRevokeClientDoc(LHCLIENTDOC hServerDoc)
 {
     dprintf_ole(stdnimp,"OleRevokeClientDoc:%ld\n",hServerDoc);
     return OLE_OK;
@@ -50,7 +47,7 @@
 /***********************************************************************
  *           OleIsDcMeta
  */
-BOOL WINAPI OleIsDcMeta(HDC hdc)
+BOOL OleIsDcMeta(HDC hdc)
 {
 	dprintf_ole(stddeb,"OleIsDCMeta(%04x)\n",hdc);
 	return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
diff --git a/misc/olesvr.c b/misc/olesvr.c
index 53351c2..4035e08 100644
--- a/misc/olesvr.c
+++ b/misc/olesvr.c
@@ -17,12 +17,9 @@
 /***********************************************************************
  *           OleRegisterServer
  */
-OLESTATUS WINAPI OleRegisterServer(
-	LPCSTR	name,
-	LPOLESERVER serverStruct,
-	LHSERVER FAR *hRet,
-	HINSTANCE hServer,
-	OLE_SERVER_USE use)
+OLESTATUS OleRegisterServer( LPCSTR name, LPOLESERVER serverStruct,
+                             LHSERVER *hRet, HINSTANCE hServer,
+                             OLE_SERVER_USE use )
 {
     dprintf_ole(stdnimp,"OleRegisterServer:%s\n",name);
     *hRet=++OLE_current_handle;
@@ -33,7 +30,7 @@
 /***********************************************************************
  *           OleBlockServer
  */
-OLESTATUS WINAPI OleBlockServer(LHSERVER hServer)
+OLESTATUS OleBlockServer(LHSERVER hServer)
 {
     fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
     return OLE_OK;
@@ -42,7 +39,7 @@
 /***********************************************************************
  *           OleUnblockServer
  */
-OLESTATUS WINAPI OleUnblockServer(LHSERVER hServer, BOOL FAR *block)
+OLESTATUS OleUnblockServer(LHSERVER hServer, BOOL *block)
 {
     fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
     /* no more blocked messages :) */
@@ -53,11 +50,8 @@
 /***********************************************************************
  *           OleRegisterServerDoc
  */
-OLESTATUS WINAPI OleRegisterServerDoc(
-	LHSERVER hServer,
-	LPCSTR docname,
-	LPOLESERVERDOC document,
-	LHSERVERDOC FAR *hRet)
+OLESTATUS OleRegisterServerDoc( LHSERVER hServer, LPCSTR docname,
+                                LPOLESERVERDOC document, LHSERVERDOC *hRet)
 {
     dprintf_ole(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
     *hRet=++OLE_current_handle;
@@ -67,7 +61,7 @@
 /***********************************************************************
  *           OleRevokeServerDoc
  */
-OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC hServerDoc)
+OLESTATUS OleRevokeServerDoc(LHSERVERDOC hServerDoc)
 {
     dprintf_ole(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
     return OLE_OK;
@@ -76,7 +70,7 @@
 /***********************************************************************
  *           OleRevokeServer
  */
-OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer)
+OLESTATUS OleRevokeServer(LHSERVER hServer)
 {
     dprintf_ole(stdnimp,"OleRevokeServer:%ld\n",hServer);
     return OLE_OK;
diff --git a/misc/registry.c b/misc/registry.c
index 182f471..7dee810 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -105,7 +105,7 @@
 		if (openhandles[i].hkey==hkey)
 			break;
 	if (i==nrofopenhandles) {
-		dprintf_reg(stddeb,"remove_handle:Didn't find handle %lx?\n",hkey);
+		dprintf_reg(stddeb,"remove_handle:Didn't find handle %08x?\n",hkey);
 		return;
 	}
 	memcpy(	openhandles+i,
@@ -728,8 +728,7 @@
  */
 
 /* RegOpenKeyExW		[ADVAPI32.150] */
-WINAPI DWORD
-RegOpenKeyExW(
+DWORD RegOpenKeyExW(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	DWORD	dwReserved,
@@ -776,8 +775,7 @@
 }
 
 /* RegOpenKeyW			[ADVAPI32.151] */
-WINAPI DWORD
-RegOpenKeyW(
+DWORD RegOpenKeyW(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -790,8 +788,7 @@
 
 
 /* RegOpenKeyExA		[ADVAPI32.149] */
-WINAPI DWORD
-RegOpenKeyExA(
+DWORD RegOpenKeyExA(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	DWORD	dwReserved,
@@ -815,8 +812,7 @@
 }
 
 /* RegOpenKeyA			[ADVAPI32.148] */
-WINAPI DWORD
-RegOpenKeyA(
+DWORD RegOpenKeyA(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -828,8 +824,7 @@
 }
 
 /* RegOpenKey			[SHELL.1] [KERNEL.217] */
-WINAPI DWORD
-RegOpenKey(
+DWORD RegOpenKey(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -854,8 +849,7 @@
  */
 
 /* RegCreateKeyExW		[ADVAPI32.131] */
-WINAPI DWORD
-RegCreateKeyExW(
+DWORD RegCreateKeyExW(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	DWORD	dwReserved,
@@ -955,8 +949,7 @@
 }
 
 /* RegCreateKeyW		[ADVAPI32.132] */
-WINAPI DWORD
-RegCreateKeyW(
+DWORD RegCreateKeyW(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -981,8 +974,7 @@
 }
 
 /* RegCreateKeyExA		[ADVAPI32.130] */
-WINAPI DWORD
-RegCreateKeyExA(
+DWORD RegCreateKeyExA(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	DWORD	dwReserved,
@@ -1034,8 +1026,7 @@
 }
 
 /* RegCreateKeyA		[ADVAPI32.129] */
-WINAPI DWORD
-RegCreateKeyA(
+DWORD RegCreateKeyA(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -1059,8 +1050,7 @@
 }
 
 /* RegCreateKey			[SHELL.2] [KERNEL.218] */
-WINAPI DWORD
-RegCreateKey(
+DWORD RegCreateKey(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	LPHKEY	retkey
@@ -1084,8 +1074,7 @@
  */
 
 /* RegQueryValueExW		[ADVAPI32.158] */
-WINAPI DWORD
-RegQueryValueExW(
+DWORD RegQueryValueExW(
 	HKEY	hkey,
 	LPWSTR	lpszValueName,
 	LPDWORD	lpdwReserved,
@@ -1096,7 +1085,7 @@
 	LPKEYSTRUCT	lpkey;
 	int		i;
 
-	dprintf_reg(stddeb,"RegQueryValueExW(%lx,%s,%p,%p,%p,%p)\n",
+	dprintf_reg(stddeb,"RegQueryValueExW(%x,%s,%p,%p,%p,%p)\n",
 		hkey,W2C(lpszValueName,0),lpdwReserved,lpdwType,lpbData,lpcbData
 	);
 
@@ -1141,8 +1130,7 @@
 }
 
 /* RegQueryValueW		[ADVAPI32.159] */
-WINAPI DWORD
-RegQueryValueW(
+DWORD RegQueryValueW(
 	HKEY	hkey,
 	LPWSTR	lpszSubKey,
 	LPWSTR	lpszData,
@@ -1151,7 +1139,7 @@
 	HKEY	xhkey;
 	DWORD	ret,lpdwType;
 
-	dprintf_reg(stddeb,"RegQueryValueW(%lx,%s,%p,%p)\n->",
+	dprintf_reg(stddeb,"RegQueryValueW(%x,%s,%p,%p)\n->",
 		hkey,W2C(lpszSubKey,0),lpszData,lpcbData
 	);
 
@@ -1178,8 +1166,7 @@
 }
 
 /* RegQueryValueExA		[ADVAPI32.157] */
-WINAPI DWORD
-RegQueryValueExA(
+DWORD RegQueryValueExA(
 	HKEY	hkey,
 	LPSTR	lpszValueName,
 	LPDWORD	lpdwReserved,
@@ -1192,7 +1179,7 @@
 	DWORD	ret,myxlen;
 	DWORD	*mylen;
 
-	dprintf_reg(stddeb,"RegQueryValueExA(%lx,%s,%p,%p,%p,%p)\n->",
+	dprintf_reg(stddeb,"RegQueryValueExA(%x,%s,%p,%p,%p,%p)\n->",
 		hkey,lpszValueName,lpdwReserved,lpdwType,lpbData,lpcbData
 	);
 	if (lpbData) {
@@ -1250,8 +1237,7 @@
 }
 
 /* RegQueryValueEx		[KERNEL.225] */
-WINAPI DWORD
-RegQueryValueEx(
+DWORD RegQueryValueEx(
 	HKEY	hkey,
 	LPSTR	lpszValueName,
 	LPDWORD	lpdwReserved,
@@ -1259,7 +1245,7 @@
 	LPBYTE	lpbData,
 	LPDWORD	lpcbData
 ) {
-	dprintf_reg(stddeb,"RegQueryValueEx(%lx,%s,%p,%p,%p,%p)\n",
+	dprintf_reg(stddeb,"RegQueryValueEx(%x,%s,%p,%p,%p,%p)\n",
 		hkey,lpszValueName,lpdwReserved,lpdwType,lpbData,lpcbData
 	);
 	return RegQueryValueExA(	
@@ -1273,8 +1259,7 @@
 }
 
 /* RegQueryValueA		[ADVAPI32.156] */
-WINAPI DWORD
-RegQueryValueA(
+DWORD RegQueryValueA(
 	HKEY	hkey,
 	LPSTR	lpszSubKey,
 	LPSTR	lpszData,
@@ -1283,7 +1268,7 @@
 	HKEY	xhkey;
 	DWORD	ret,lpdwType;
 
-	dprintf_reg(stddeb,"RegQueryValueA(%lx,%s,%p,%p)\n",
+	dprintf_reg(stddeb,"RegQueryValueA(%x,%s,%p,%p)\n",
 		hkey,lpszSubKey,lpszData,lpcbData
 	);
 
@@ -1310,14 +1295,13 @@
 }
 
 /* RegQueryValue		[SHELL.6] [KERNEL.224] */
-WINAPI DWORD
-RegQueryValue(
+DWORD RegQueryValue(
 	HKEY	hkey,
 	LPSTR	lpszSubKey,
 	LPSTR	lpszData,
 	LPDWORD	lpcbData
 ) {
-	dprintf_reg(stddeb,"RegQueryValueA(%lx,%s,%p,%p)\n",
+	dprintf_reg(stddeb,"RegQueryValueA(%x,%s,%p,%p)\n",
 		hkey,lpszSubKey,lpszData,lpcbData
 	);
 	return RegQueryValueA(hkey,lpszSubKey,lpszData,lpcbData);
@@ -1332,8 +1316,7 @@
  */
 
 /* RegSetValueExW		[ADVAPI32.170] */
-WINAPI DWORD
-RegSetValueExW(
+DWORD RegSetValueExW(
 	HKEY	hkey,
 	LPWSTR	lpszValueName,
 	DWORD	dwReserved,
@@ -1344,7 +1327,7 @@
 	LPKEYSTRUCT	lpkey;
 	int		i;
 
-	dprintf_reg(stddeb,"RegSetValueExW(%lx,%s,%ld,%ld,%p,%ld)\n",
+	dprintf_reg(stddeb,"RegSetValueExW(%x,%s,%ld,%ld,%p,%ld)\n",
 		hkey,W2C(lpszValueName,0),dwReserved,dwType,lpbData,cbData
 	);
 	/* we no longer care about the lpbData dwType here... */
@@ -1384,8 +1367,7 @@
 }
 
 /* RegSetValueExA		[ADVAPI32.169] */
-WINAPI DWORD
-RegSetValueExA(
+DWORD RegSetValueExA(
 	HKEY	hkey,
 	LPSTR	lpszValueName,
 	DWORD	dwReserved,
@@ -1397,7 +1379,7 @@
 	LPWSTR	lpszValueNameW;
 	DWORD	ret;
 
-	dprintf_reg(stddeb,"RegSetValueExA(%lx,%s,%ld,%ld,%p,%ld)\n->",
+	dprintf_reg(stddeb,"RegSetValueExA(%x,%s,%ld,%ld,%p,%ld)\n->",
 		hkey,lpszValueName,dwReserved,dwType,lpbData,cbData
 	);
 	if ((1<<dwType) & UNICONVMASK) {
@@ -1418,8 +1400,7 @@
 }
 
 /* RegSetValueEx		[KERNEL.226] */
-WINAPI DWORD
-RegSetValueEx(
+DWORD RegSetValueEx(
 	HKEY	hkey,
 	LPSTR	lpszValueName,
 	DWORD	dwReserved,
@@ -1427,15 +1408,14 @@
 	LPBYTE	lpbData,
 	DWORD	cbData
 ) {
-	dprintf_reg(stddeb,"RegSetValueEx(%lx,%s,%ld,%ld,%p,%ld)\n->",
+	dprintf_reg(stddeb,"RegSetValueEx(%x,%s,%ld,%ld,%p,%ld)\n->",
 		hkey,lpszValueName,dwReserved,dwType,lpbData,cbData
 	);
 	return RegSetValueExA(hkey,lpszValueName,dwReserved,dwType,lpbData,cbData);
 }
 
 /* RegSetValueW			[ADVAPI32.171] */
-WINAPI DWORD
-RegSetValueW(
+DWORD RegSetValueW(
 	HKEY	hkey,
 	LPCWSTR	lpszSubKey,
 	DWORD	dwType,
@@ -1445,7 +1425,7 @@
 	HKEY	xhkey;
 	DWORD	ret;
 
-	dprintf_reg(stddeb,"RegSetValueW(%lx,%s,%ld,%s,%ld)\n->",
+	dprintf_reg(stddeb,"RegSetValueW(%x,%s,%ld,%s,%ld)\n->",
 		hkey,W2C(lpszSubKey,0),dwType,W2C(lpszData,0),cbData
 	);
 	if (lpszSubKey && *lpszSubKey) {
@@ -1471,8 +1451,7 @@
 
 }
 /* RegSetValueA			[ADVAPI32.168] */
-WINAPI DWORD
-RegSetValueA(
+DWORD RegSetValueA(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	DWORD	dwType,
@@ -1482,7 +1461,7 @@
 	DWORD	ret;
 	HKEY	xhkey;
 
-	dprintf_reg(stddeb,"RegSetValueA(%lx,%s,%ld,%s,%ld)\n->",
+	dprintf_reg(stddeb,"RegSetValueA(%x,%s,%ld,%s,%ld)\n->",
 		hkey,lpszSubKey,dwType,lpszData,cbData
 	);
 	if (lpszSubKey && *lpszSubKey) {
@@ -1505,8 +1484,7 @@
 }
 
 /* RegSetValue			[KERNEL.221] [SHELL.5] */
-WINAPI DWORD
-RegSetValue(
+DWORD RegSetValue(
 	HKEY	hkey,
 	LPCSTR	lpszSubKey,
 	DWORD	dwType,
@@ -1514,7 +1492,7 @@
 	DWORD	cbData
 ) {
 	DWORD	ret;
-	dprintf_reg(stddeb,"RegSetValue(%lx,%s,%ld,%s,%ld)\n->",
+	dprintf_reg(stddeb,"RegSetValue(%x,%s,%ld,%s,%ld)\n->",
 		hkey,lpszSubKey,dwType,lpszData,cbData
 	);
 	ret=RegSetValueA(hkey,lpszSubKey,dwType,lpszData,cbData);
@@ -1530,8 +1508,7 @@
  */
 
 /* RegEnumKeyExW		[ADVAPI32.139] */
-WINAPI DWORD
-RegEnumKeyExW(
+DWORD RegEnumKeyExW(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPWSTR	lpszName,
@@ -1543,7 +1520,7 @@
 ) {
 	LPKEYSTRUCT	lpkey,lpxkey;
 
-	dprintf_reg(stddeb,"RegEnumKeyExW(%lx,%ld,%p,%ld,%p,%p,%p,%p)\n",
+	dprintf_reg(stddeb,"RegEnumKeyExW(%x,%ld,%p,%ld,%p,%p,%p,%p)\n",
 		hkey,iSubkey,lpszName,*lpcchName,lpdwReserved,lpszClass,lpcchClass,ft
 	);
 	lpkey=lookup_hkey(hkey);
@@ -1571,8 +1548,7 @@
 }
 
 /* RegEnumKeyW			[ADVAPI32.140] */
-WINAPI DWORD
-RegEnumKeyW(
+DWORD RegEnumKeyW(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPWSTR	lpszName,
@@ -1580,14 +1556,13 @@
 ) {
 	FILETIME	ft;
 
-	dprintf_reg(stddeb,"RegEnumKeyW(%lx,%ld,%p,%ld)\n->",
+	dprintf_reg(stddeb,"RegEnumKeyW(%x,%ld,%p,%ld)\n->",
 		hkey,iSubkey,lpszName,lpcchName
 	);
 	return RegEnumKeyExW(hkey,iSubkey,lpszName,&lpcchName,NULL,NULL,NULL,&ft);
 }
 /* RegEnumKeyExA		[ADVAPI32.138] */
-WINAPI DWORD
-RegEnumKeyExA(
+DWORD RegEnumKeyExA(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPSTR	lpszName,
@@ -1601,7 +1576,7 @@
 	LPWSTR	lpszNameW,lpszClassW;
 
 
-	dprintf_reg(stddeb,"RegEnumKeyExA(%lx,%ld,%p,%ld,%p,%p,%p,%p)\n->",
+	dprintf_reg(stddeb,"RegEnumKeyExA(%x,%ld,%p,%ld,%p,%p,%p,%p)\n->",
 		hkey,iSubkey,lpszName,*lpcchName,lpdwReserved,lpszClass,lpcchClass,ft
 	);
 	if (lpszName) {
@@ -1644,8 +1619,7 @@
 }
 
 /* RegEnumKeyA			[ADVAPI32.137] */
-WINAPI DWORD
-RegEnumKeyA(
+DWORD RegEnumKeyA(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPSTR	lpszName,
@@ -1653,7 +1627,7 @@
 ) {
 	FILETIME	ft;
 
-	dprintf_reg(stddeb,"RegEnumKeyA(%lx,%ld,%p,%ld)\n->",
+	dprintf_reg(stddeb,"RegEnumKeyA(%x,%ld,%p,%ld)\n->",
 		hkey,iSubkey,lpszName,lpcchName
 	);
 	return	RegEnumKeyExA(
@@ -1669,14 +1643,13 @@
 }
 
 /* RegEnumKey			[SHELL.7] [KERNEL.216] */
-WINAPI DWORD
-RegEnumKey(
+DWORD RegEnumKey(
 	HKEY	hkey,
 	DWORD	iSubkey,
 	LPSTR	lpszName,
 	DWORD	lpcchName
 ) {
-	dprintf_reg(stddeb,"RegEnumKey(%lx,%ld,%p,%ld)\n->",
+	dprintf_reg(stddeb,"RegEnumKey(%x,%ld,%p,%ld)\n->",
 		hkey,iSubkey,lpszName,lpcchName
 	);
 	return RegEnumKeyA(hkey,iSubkey,lpszName,lpcchName);
@@ -1690,8 +1663,7 @@
  */
 
 /* RegEnumValueW		[ADVAPI32.142] */
-WINAPI DWORD
-RegEnumValueW(
+DWORD RegEnumValueW(
 	HKEY	hkey,
 	DWORD	iValue,
 	LPWSTR	lpszValue,
@@ -1704,7 +1676,7 @@
 	LPKEYSTRUCT	lpkey;
 	LPKEYVALUE	val;
 
-	dprintf_reg(stddeb,"RegEnumValueW(%ld,%ld,%p,%p,%p,%p,%p,%p)\n",
+	dprintf_reg(stddeb,"RegEnumValueW(%x,%ld,%p,%p,%p,%p,%p,%p)\n",
 		hkey,iValue,lpszValue,lpcchValue,lpdReserved,lpdwType,lpbData,lpcbData
 	);
 	lpkey = lookup_hkey(hkey);
@@ -1737,8 +1709,7 @@
 }
 
 /* RegEnumValueA		[ADVAPI32.141] */
-WINAPI DWORD
-RegEnumValueA(
+DWORD RegEnumValueA(
 	HKEY	hkey,
 	DWORD	iValue,
 	LPSTR	lpszValue,
@@ -1752,7 +1723,7 @@
 	LPBYTE	lpbDataW;
 	DWORD	ret,lpcbDataW;
 
-	dprintf_reg(stddeb,"RegEnumValueA(%ld,%ld,%p,%p,%p,%p,%p,%p)\n",
+	dprintf_reg(stddeb,"RegEnumValueA(%x,%ld,%p,%p,%p,%p,%p,%p)\n",
 		hkey,iValue,lpszValue,lpcchValue,lpdReserved,lpdwType,lpbData,lpcbData
 	);
 
@@ -1795,8 +1766,7 @@
 }
 
 /* RegEnumValue			[KERNEL.223] */
-WINAPI DWORD
-RegEnumValue(
+DWORD RegEnumValue(
 	HKEY	hkey,
 	DWORD	iValue,
 	LPSTR	lpszValue,
@@ -1806,7 +1776,7 @@
 	LPBYTE	lpbData,
 	LPDWORD	lpcbData
 ) {
-	dprintf_reg(stddeb,"RegEnumValue(%ld,%ld,%p,%p,%p,%p,%p,%p)\n",
+	dprintf_reg(stddeb,"RegEnumValue(%x,%ld,%p,%p,%p,%p,%p,%p)\n",
 		hkey,iValue,lpszValue,lpcchValue,lpdReserved,lpdwType,lpbData,lpcbData
 	);
 	return RegEnumValueA(
@@ -1825,9 +1795,8 @@
  *  Close registry key
  */
 /* RegCloseKey			[SHELL.3] [KERNEL.220] [ADVAPI32.126] */
-WINAPI DWORD
-RegCloseKey(HKEY hkey) {
-	dprintf_reg(stddeb,"RegCloseKey(%ld)\n",hkey);
+DWORD RegCloseKey(HKEY hkey) {
+	dprintf_reg(stddeb,"RegCloseKey(%x)\n",hkey);
 	remove_handle(hkey);
 	return ERROR_SUCCESS;
 }
@@ -1838,13 +1807,12 @@
  * RegDeleteKey -> RegDeleteKeyA -> RegDeleteKeyW
  */
 /* RegDeleteKeyW		[ADVAPI32.134] */
-WINAPI DWORD
-RegDeleteKeyW(HKEY hkey,LPWSTR lpszSubKey) {
+DWORD RegDeleteKeyW(HKEY hkey,LPWSTR lpszSubKey) {
 	LPKEYSTRUCT	*lplpPrevKey,lpNextKey,lpxkey;
 	LPWSTR		*wps;
 	int		wpc,i;
 
-	dprintf_reg(stddeb,"RegDeleteKeyW(%ld,%s)\n",
+	dprintf_reg(stddeb,"RegDeleteKeyW(%x,%s)\n",
 		hkey,W2C(lpszSubKey,0)
 	);
 	lpNextKey	= lookup_hkey(hkey);
@@ -1895,12 +1863,11 @@
 }
 
 /* RegDeleteKeyA		[ADVAPI32.133] */
-WINAPI DWORD
-RegDeleteKeyA(HKEY hkey,LPCSTR lpszSubKey) {
+DWORD RegDeleteKeyA(HKEY hkey,LPCSTR lpszSubKey) {
 	LPWSTR	lpszSubKeyW;
 	DWORD	ret;
 
-	dprintf_reg(stddeb,"RegDeleteKeyA(%ld,%s)\n",
+	dprintf_reg(stddeb,"RegDeleteKeyA(%x,%s)\n",
 		hkey,lpszSubKey
 	);
 	lpszSubKeyW=strdupA2W(lpszSubKey);
@@ -1910,9 +1877,8 @@
 }
 
 /* RegDeleteKey			[SHELL.4] [KERNEL.219] */
-WINAPI DWORD
-RegDeleteKey(HKEY hkey,LPCSTR lpszSubKey) {
-	dprintf_reg(stddeb,"RegDeleteKey(%ld,%s)\n",
+DWORD RegDeleteKey(HKEY hkey,LPCSTR lpszSubKey) {
+	dprintf_reg(stddeb,"RegDeleteKey(%x,%s)\n",
 		hkey,lpszSubKey
 	);
 	return RegDeleteKeyA(hkey,lpszSubKey);
@@ -1925,13 +1891,12 @@
  * RegDeleteValue -> RegDeleteValueA -> RegDeleteValueW
  */
 /* RegDeleteValueW		[ADVAPI32.136] */
-WINAPI DWORD
-RegDeleteValueW(HKEY hkey,LPWSTR lpszValue) {
+DWORD RegDeleteValueW(HKEY hkey,LPWSTR lpszValue) {
 	DWORD		i;
 	LPKEYSTRUCT	lpkey;
 	LPKEYVALUE	val;
 
-	dprintf_reg(stddeb,"RegDeleteValueW(%ld,%s)\n",
+	dprintf_reg(stddeb,"RegDeleteValueW(%x,%s)\n",
 		hkey,W2C(lpszValue,0)
 	);
 	lpkey=lookup_hkey(hkey);
@@ -1965,14 +1930,11 @@
 }
 
 /* RegDeleteValueA		[ADVAPI32.135] */
-WINAPI DWORD
-RegDeleteValueA(HKEY hkey,LPSTR lpszValue) {
+DWORD RegDeleteValueA(HKEY hkey,LPSTR lpszValue) {
 	LPWSTR	lpszValueW;
 	DWORD	ret;
 
-	dprintf_reg(stddeb,"RegDeleteValueA(%ld,%s)\n",
-		hkey,lpszValue
-	);
+	dprintf_reg( stddeb, "RegDeleteValueA(%x,%s)\n", hkey,lpszValue );
 	if (lpszValue)
 		lpszValueW=strdupA2W(lpszValue);
 	else
@@ -1984,26 +1946,21 @@
 }
 
 /* RegDeleteValue		[KERNEL.222] */
-WINAPI DWORD
-RegDeleteValue(HKEY hkey,LPSTR lpszValue) {
-	dprintf_reg(stddeb,"RegDeleteValue(%ld,%s)\n",
-		hkey,lpszValue
-	);
+DWORD RegDeleteValue(HKEY hkey,LPSTR lpszValue) {
+	dprintf_reg( stddeb,"RegDeleteValue(%x,%s)\n", hkey,lpszValue );
 	return RegDeleteValueA(hkey,lpszValue);
 }
 
 /* RegFlushKey			[ADVAPI32.143] [KERNEL.227] */
-WINAPI DWORD
-RegFlushKey(HKEY hkey) {
-	dprintf_reg(stddeb,"RegFlushKey(%ld), STUB.\n",hkey);
+DWORD RegFlushKey(HKEY hkey) {
+	dprintf_reg(stddeb,"RegFlushKey(%x), STUB.\n",hkey);
 	return SHELL_ERROR_SUCCESS;
 }
 
 /* FIXME: lpcchXXXX ... is this counting in WCHARS or in BYTEs ?? */
 
 /* RegQueryInfoKeyW		[ADVAPI32.153] */
-WINAPI DWORD
-RegQueryInfoKeyW(
+DWORD RegQueryInfoKeyW(
 	HKEY	hkey,
 	LPWSTR	lpszClass,
 	LPDWORD	lpcchClass,
@@ -2021,7 +1978,7 @@
 	int		nrofkeys,maxsubkey,maxclass,maxvalues,maxvname,maxvdata;
 	int		i;
 
-	dprintf_reg(stddeb,"RegQueryInfoKeyW(%lx,......)\n",hkey);
+	dprintf_reg(stddeb,"RegQueryInfoKeyW(%x,......)\n",hkey);
 	lpkey=lookup_hkey(hkey);
 	if (!lpkey)
 		return SHELL_ERROR_BADKEY;
@@ -2079,8 +2036,7 @@
 }
 
 /* RegQueryInfoKeyA		[ADVAPI32.152] */
-WINAPI DWORD
-RegQueryInfoKeyA(
+DWORD RegQueryInfoKeyA(
 	HKEY	hkey,
 	LPSTR	lpszClass,
 	LPDWORD	lpcchClass,
@@ -2097,7 +2053,7 @@
 	LPWSTR		lpszClassW;
 	DWORD		ret;
 
-	dprintf_reg(stddeb,"RegQueryInfoKeyA(%lx,......)\n",hkey);
+	dprintf_reg(stddeb,"RegQueryInfoKeyA(%x,......)\n",hkey);
 	if (lpszClass) {
 		*lpcchClass*= 2;
 		lpszClassW  = (LPWSTR)xmalloc(*lpcchClass);
diff --git a/misc/shell.c b/misc/shell.c
index 66fd258..dd2d591 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -50,7 +50,7 @@
     dprintf_reg(stddeb,"DragQueryFile(%04x, %i, %p, %u)\n",
 		hDrop,wFile,lpszFile,wLength);
     
-    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop); 
+    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock16(hDrop); 
     if(!lpDropFileStruct)
     {
 	dprintf_reg(stddeb,"DragQueryFile: unable to lock handle!\n");
@@ -73,7 +73,7 @@
     strncpy(lpszFile, lpCurrent, i);
     lpszFile[i] = '\0';
     
-    GlobalUnlock(hDrop);
+    GlobalUnlock16(hDrop);
     return i;
 }
 
@@ -83,24 +83,24 @@
  */
 void DragFinish(HDROP h)
 {
-    GlobalFree((HGLOBAL)h);
+    GlobalFree16((HGLOBAL16)h);
 }
 
 
 /*************************************************************************
  *				DragQueryPoint		[SHELL.13]
  */
-BOOL DragQueryPoint(HDROP hDrop, POINT FAR *p)
+BOOL DragQueryPoint(HDROP hDrop, POINT *p)
 {
     LPDROPFILESTRUCT lpDropFileStruct;  
     BOOL             bRet;
 
-    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
+    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock16(hDrop);
 
     memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT));
     bRet = lpDropFileStruct->fInNonClientArea;
 
-    GlobalUnlock(hDrop);
+    GlobalUnlock16(hDrop);
     return bRet;
 }
 
@@ -179,11 +179,11 @@
 	  }
 	} else {
 	  fprintf(stddeb,"ShellExecute: No %s\\shell\\%s\\command found for \"%s\" suffix.\n",subclass,lpOperation,p);
-	  return (HINSTANCE)14; /* unknown type */
+	  return (HINSTANCE)31; /* unknown type */
 	}
       } else {
 	fprintf(stddeb,"ShellExecute: No operation found for \"%s\" suffix.\n",p);
-	return (HINSTANCE)14; /* file not found */
+	return (HINSTANCE)31; /* file not found */
       }
     }
     dprintf_exec(stddeb,"ShellExecute:starting %s\n",cmd);
@@ -202,7 +202,7 @@
         return 31;		/* no association */
 }
 
-static char AppName[128], AppMisc[906];
+static char AppName[128], AppMisc[1536];
 
 /*************************************************************************
  *				AboutDlgProc		[SHELL.33]
@@ -313,7 +313,7 @@
  BYTE*	ptr;
  HANDLE handle = DirectResAlloc( hInst, 0x10, (DWORD)pNInfo->length << sizeShift);
 
- if( (ptr = (BYTE*)GlobalLock( handle )) )
+ if( (ptr = (BYTE*)GlobalLock16( handle )) )
    {
     _llseek( hFile, (DWORD)pNInfo->offset << sizeShift, SEEK_SET);
      FILE_Read( hFile, (char*)ptr, pNInfo->length << sizeShift);
@@ -340,8 +340,8 @@
 
   if( hFile == HFILE_ERROR || !n ) return 0;
 
-  hRet = GlobalAlloc( GMEM_MOVEABLE, sizeof(HICON)*n);
-  RetPtr = (HICON*)GlobalLock(hRet);
+  hRet = GlobalAlloc16( GMEM_FIXED, sizeof(HICON)*n);
+  RetPtr = (HICON*)GlobalLock16(hRet);
 
  *RetPtr = (n == 0xFFFF)? 0: 1;				/* error return values */
 
@@ -397,7 +397,7 @@
 		       hIcon = SHELL_LoadResource( hInstance, hFile, pIconDir + (i - nIconIndex), 
 										 *(WORD*)pData );
 		       RetPtr[i-nIconIndex] = GetIconID( hIcon, 3 );
-		       GlobalFree(hIcon); 
+		       GlobalFree16(hIcon); 
 		     }
 
 		  for( icon = nIconIndex; icon < nIconIndex + n; icon++ )
@@ -429,10 +429,10 @@
 
   if( handle )
     {
-      HICON* ptr = (HICON*)GlobalLock(handle);
+      HICON* ptr = (HICON*)GlobalLock16(handle);
       HICON  hIcon = *ptr;
 
-      GlobalFree(handle);
+      GlobalFree16(handle);
       return hIcon;
     }
   return 0;
diff --git a/misc/sound.c b/misc/sound.c
index 990bb72..9b72416 100644
--- a/misc/sound.c
+++ b/misc/sound.c
@@ -83,7 +83,7 @@
         return 0;
 }
 
-LPINT GetThresholdEvent(void)
+LPINT16 GetThresholdEvent(void)
 {
 	fprintf(stderr, "GetThresholdEvent()\n");
         return NULL;
diff --git a/misc/user.c b/misc/user.c
index dc8dc8d..fbaa897 100644
--- a/misc/user.c
+++ b/misc/user.c
@@ -12,15 +12,15 @@
 #include "user.h"
 #include "task.h"
 #include "queue.h"
-#include "class.h"
 #include "win.h"
 #include "hook.h"
 #include "debug.h"
 #include "toolhelp.h"
 
-#ifndef WINELIB
 WORD USER_HeapSel = 0;
 
+#ifndef WINELIB
+
 extern void 	TIMER_NukeTimers(HWND, HQUEUE );
 extern HTASK	TASK_GetNextTask(HTASK);
 
diff --git a/misc/winsocket.c b/misc/winsocket.c
index f52c588..0ebfaca 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -1104,8 +1104,8 @@
 }
 
 
-HANDLE WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, const char *addr,
-		 INT len, INT type, char *buf, INT buflen)
+HANDLE WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, LPCSTR addr,
+                             INT len, INT type, LPSTR buf, INT buflen)
 {
 	HANDLE handle;
 	struct hostent *host;
@@ -1139,8 +1139,8 @@
 }
 
 
-HANDLE WSAAsyncGetHostByName(HWND hWnd, u_int wMsg, const char *name, 
-			char *buf, INT buflen)
+HANDLE WSAAsyncGetHostByName(HWND hWnd, u_int wMsg, LPCSTR name, 
+                             LPSTR buf, INT buflen)
 {
 	HANDLE handle;
 	struct hostent *host;
@@ -1174,8 +1174,8 @@
 }                     
 
 
-HANDLE WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg, const char *name, 
-			char *buf, INT buflen)
+HANDLE WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg, LPCSTR name, 
+                              LPSTR buf, INT buflen)
 {
 	HANDLE handle;
 	struct protoent *proto;
@@ -1210,7 +1210,7 @@
 
 
 HANDLE WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg, INT number, 
-			char *buf, INT buflen)
+                                LPSTR buf, INT buflen)
 {
 	HANDLE handle;
 	struct protoent *proto;
@@ -1244,8 +1244,8 @@
 }
 
 
-HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg, const char *name, 
-			const char *proto, char *buf, INT buflen)
+HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg, LPCSTR name, 
+                             LPCSTR proto, LPSTR buf, INT buflen)
 {
 	HANDLE handle;
 	struct servent *service;
@@ -1279,8 +1279,8 @@
 }
 
 
-HANDLE WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port, const char 
-			*proto, char *buf, INT buflen)
+HANDLE WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port, LPCSTR proto,
+                             LPSTR buf, INT buflen)
 {
 	HANDLE handle;
 	struct servent *service;
@@ -1508,10 +1508,10 @@
 
 	/* alloc winsock heap */
 
-    if ((HeapHandle = GlobalAlloc(GMEM_FIXED,sizeof(struct WinSockHeap))) == 0)
+    if ((HeapHandle = GlobalAlloc16(GMEM_FIXED,sizeof(struct WinSockHeap))) == 0)
 	return WSASYSNOTREADY;
 
-    Heap = (struct WinSockHeap *) GlobalLock(HeapHandle);
+    Heap = (struct WinSockHeap *) GlobalLock16(HeapHandle);
 
     /* return winsock information */
     memcpy(lpWSAData, &WINSOCK_data, sizeof(WINSOCK_data)); 
diff --git a/miscemu/dosmem.c b/miscemu/dosmem.c
index 6fd52e2..9bcf311 100644
--- a/miscemu/dosmem.c
+++ b/miscemu/dosmem.c
@@ -154,7 +154,7 @@
  */
 void DOSMEM_FillBiosSegment(void)
 {
-    pBiosData = (BIOSDATA *)GlobalLock( DOSMEM_BiosSeg );
+    pBiosData = (BIOSDATA *)GlobalLock16( DOSMEM_BiosSeg );
 
       /* Clear all unused values */
     memset( pBiosData, 0, sizeof(*pBiosData) );
diff --git a/miscemu/dpmi.c b/miscemu/dpmi.c
index 2f9319d..291af75 100644
--- a/miscemu/dpmi.c
+++ b/miscemu/dpmi.c
@@ -178,7 +178,7 @@
 
     case 0x0205:  /* Set protected mode interrupt vector */
 	INT_SetHandler( BL_reg(&context),
-                       (SEGPTR)MAKELONG( DX_reg(&context), CX_reg(&context) ));
+                     PTR_SEG_OFF_TO_SEGPTR(CX_reg(&context),DX_reg(&context)));
 	break;
 
     case 0x0300:  /* Simulate real mode interrupt 
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 53e0769..7d00ee2 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -85,7 +85,7 @@
 
 BYTE *GetCurrentDTA(void)
 {
-    TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
+    TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
     return (BYTE *)PTR_SEG_TO_LIN( pTask->dta );
 }
 
@@ -1009,8 +1009,8 @@
 
     case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */
         {
-            TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
-            pTask->dta = MAKELONG( DX_reg(&context), DS_reg(&context) );
+            TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
+            pTask->dta = PTR_SEG_OFF_TO_SEGPTR(DS_reg(&context),DX_reg(&context));
             dprintf_int(stddeb, "int21: Set DTA: %08lx\n", pTask->dta);
         }
         break;
@@ -1030,7 +1030,7 @@
 		
     case 0x25: /* SET INTERRUPT VECTOR */
         INT_SetHandler( AL_reg(&context),
-                        MAKELONG( DX_reg(&context), DS_reg(&context) ) );
+                   PTR_SEG_OFF_TO_SEGPTR( DS_reg(&context), DX_reg(&context)));
         break;
 
     case 0x2a: /* GET SYSTEM DATE */
@@ -1056,7 +1056,7 @@
 
     case 0x2f: /* GET DISK TRANSFER AREA ADDRESS */
         {
-            TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
+            TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
             ES_reg(&context) = SELECTOROF( pTask->dta );
             BX_reg(&context) = OFFSETOF( pTask->dta );
         }
@@ -1175,8 +1175,8 @@
     case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
         {
             LONG result = _hread( BX_reg(&context),
-                                  (SEGPTR)MAKELONG( DX_reg(&context),
-                                                    DS_reg(&context) ),
+                                  PTR_SEG_OFF_TO_SEGPTR( DS_reg(&context),
+                                                         DX_reg(&context) ),
                                   CX_reg(&context) );
             if (result == -1)
             {
@@ -1608,15 +1608,15 @@
 
 BOOL INT21_Init(void)
 {
-    if ((DosHeapHandle = GlobalAlloc(GMEM_FIXED,sizeof(struct DosHeap))) == 0)
+    if (!(DosHeapHandle = GlobalAlloc16(GMEM_FIXED,sizeof(struct DosHeap))))
     {
         fprintf( stderr, "INT21_Init: Out of memory\n");
         return FALSE;
     }
-    heap = (struct DosHeap *) GlobalLock(DosHeapHandle);
+    heap = (struct DosHeap *) GlobalLock16(DosHeapHandle);
 
     dpb = &heap->dpb;
-    dpbsegptr = MAKELONG( (int)&heap->dpb - (int)heap, DosHeapHandle );
+    dpbsegptr = PTR_SEG_OFF_TO_SEGPTR(DosHeapHandle,(int)&heap->dpb-(int)heap);
     heap->InDosFlag = 0;
     strcpy(heap->biosdate, "01/01/80");
     return TRUE;
diff --git a/multimedia/audio.c b/multimedia/audio.c
index ce8da4c..b97ca58 100644
--- a/multimedia/audio.c
+++ b/multimedia/audio.c
@@ -289,8 +289,8 @@
 #endif
 	bufsize = 64000;
 	lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
-	hData = GlobalAlloc(GMEM_MOVEABLE, bufsize);
-	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock(hData);
+	hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
+	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
 	lpWaveHdr->dwUser = 0L;
 	lpWaveHdr->dwFlags = 0L;
 	lpWaveHdr->dwLoops = 0L;
@@ -312,8 +312,8 @@
 		}
 	dwRet = wodMessage(0, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	if (lpWaveHdr->lpData != NULL) {
-		GlobalUnlock(hData);
-		GlobalFree(hData);
+		GlobalUnlock16(hData);
+		GlobalFree16(hData);
 		lpWaveHdr->lpData = NULL;
 		}
 	USER_HEAP_FREE(hWaveHdr);
@@ -358,8 +358,8 @@
 		}
 	bufsize = 64000;
 	lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
-	hData = GlobalAlloc(GMEM_MOVEABLE, bufsize);
-	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock(hData);
+	hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
+	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
 	lpWaveHdr->dwBufferLength = bufsize;
 	lpWaveHdr->dwUser = 0L;
 	lpWaveHdr->dwFlags = 0L;
@@ -382,8 +382,8 @@
 	dwRet = widMessage(0, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_UNPREPARE \n");
 	if (lpWaveHdr->lpData != NULL) {
-		GlobalUnlock(hData);
-		GlobalFree(hData);
+		GlobalUnlock16(hData);
+		GlobalFree16(hData);
 		lpWaveHdr->lpData = NULL;
 		}
 	USER_HEAP_FREE(hWaveHdr);
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index de0fb0e..4630c7d 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -2161,7 +2161,7 @@
  		if (!STRCMP(MCISTR_cmdtable[i].cmd,cmd)) {
  			res=MCISTR_cmdtable[i].fun(
  				wDevID,uDevTyp,lpstrReturnString,
- 				uReturnLength,dev,keywords,nrofkeywords,
+ 				uReturnLength,dev,(LPSTR*)keywords,nrofkeywords,
  				dwFlags
  			);
  			break;
diff --git a/multimedia/midi.c b/multimedia/midi.c
index c571c9c..84a5210 100644
--- a/multimedia/midi.c
+++ b/multimedia/midi.c
@@ -107,7 +107,7 @@
 /**************************************************************************
 * 				MIDI_ReadByte			[internal]	
 */
-static DWORD MIDI_ReadByte(UINT wDevID, BYTE FAR *lpbyt)
+static DWORD MIDI_ReadByte(UINT wDevID, BYTE *lpbyt)
 {
 #ifdef linux
 	if (lpbyt != NULL) {
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index a7fc32d..a449909 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -145,8 +145,8 @@
 	lpWaveHdr = (LPWAVEHDR) USER_HEAP_LIN_ADDR(hWaveHdr);
 	lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
 	bufsize = 64000;
-	hData = GlobalAlloc(GMEM_MOVEABLE, bufsize);
-	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock(hData);
+	hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
+	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
 	lpWaveHdr->dwBufferLength = bufsize;
 	lpWaveHdr->dwUser = 0L;
 	lpWaveHdr->dwFlags = 0L;
@@ -154,8 +154,8 @@
 	dwRet = wodMessage(0, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	if (dwRet != MMSYSERR_NOERROR) {
 		dprintf_mmsys(stddeb, "sndPlaySound // can't prepare WaveOut device !\n");
-		GlobalUnlock(hData);
-		GlobalFree(hData);
+		GlobalUnlock16(hData);
+		GlobalFree16(hData);
 		USER_HEAP_FREE(hDesc);
 		USER_HEAP_FREE(hWaveHdr);
 		goto ErrSND;
@@ -169,8 +169,8 @@
 		}
 	wodMessage(0, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	wodMessage(0, WODM_CLOSE, 0, 0L, 0L);
-	GlobalUnlock(hData);
-	GlobalFree(hData);
+	GlobalUnlock16(hData);
+	GlobalFree16(hData);
 	USER_HEAP_FREE(hDesc);
 	USER_HEAP_FREE(hWaveHdr);
 	if (hmmio != 0)   mmioClose(hmmio, 0);
@@ -243,7 +243,7 @@
 /**************************************************************************
 * 				auxGetDevCaps		[MMSYSTEM.351]
 */
-UINT auxGetDevCaps(UINT uDeviceID, AUXCAPS FAR* lpCaps, UINT uSize)
+UINT auxGetDevCaps(UINT uDeviceID, AUXCAPS * lpCaps, UINT uSize)
 {
 	dprintf_mmsys(stddeb, "auxGetDevCaps(%04X, %p, %d) !\n", 
 					uDeviceID, lpCaps, uSize);
@@ -254,7 +254,7 @@
 /**************************************************************************
 * 				auxGetVolume		[MMSYSTEM.352]
 */
-UINT auxGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume)
+UINT auxGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "auxGetVolume(%04X, %p) !\n", uDeviceID, lpdwVolume);
 	return auxMessage(uDeviceID, AUXDM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -811,7 +811,7 @@
 /**************************************************************************
 * 				mciGetYieldProc		[MMSYSTEM.716]
 */
-YIELDPROC mciGetYieldProc(UINT uDeviceID, DWORD FAR* lpdwYieldData)
+YIELDPROC mciGetYieldProc(UINT uDeviceID, DWORD * lpdwYieldData)
 {
     return NULL;
 }
@@ -839,7 +839,7 @@
 /**************************************************************************
 * 				midiOutGetDevCaps	[MMSYSTEM.202]
 */
-UINT midiOutGetDevCaps(UINT uDeviceID, MIDIOUTCAPS FAR* lpCaps, UINT uSize)
+UINT midiOutGetDevCaps(UINT uDeviceID, MIDIOUTCAPS * lpCaps, UINT uSize)
 {
 	dprintf_mmsys(stddeb, "midiOutGetDevCaps\n");
 	return 0;
@@ -903,7 +903,7 @@
 /**************************************************************************
 * 				midiOutOpen    		[MMSYSTEM.204]
 */
-UINT midiOutOpen(HMIDIOUT FAR* lphMidiOut, UINT uDeviceID,
+UINT midiOutOpen(HMIDIOUT * lphMidiOut, UINT uDeviceID,
 		 DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HMIDI	hMidiOut;
@@ -954,7 +954,7 @@
 * 				midiOutPrepareHeader	[MMSYSTEM.206]
 */
 UINT midiOutPrepareHeader(HMIDIOUT hMidiOut,
-    MIDIHDR FAR* lpMidiOutHdr, UINT uSize)
+    MIDIHDR * lpMidiOutHdr, UINT uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutPrepareHeader(%04X, %p, %d)\n", 
@@ -969,7 +969,7 @@
 * 				midiOutUnprepareHeader	[MMSYSTEM.207]
 */
 UINT midiOutUnprepareHeader(HMIDIOUT hMidiOut,
-    MIDIHDR FAR* lpMidiOutHdr, UINT uSize)
+    MIDIHDR * lpMidiOutHdr, UINT uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutUnprepareHeader(%04X, %p, %d)\n", 
@@ -996,7 +996,7 @@
 * 				midiOutLongMsg		[MMSYSTEM.209]
 */
 UINT midiOutLongMsg(HMIDIOUT hMidiOut,
-    MIDIHDR FAR* lpMidiOutHdr, UINT uSize)
+    MIDIHDR * lpMidiOutHdr, UINT uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutLongMsg(%04X, %p, %d)\n", 
@@ -1022,7 +1022,7 @@
 /**************************************************************************
 * 				midiOutGetVolume	[MMSYSTEM.211]
 */
-UINT midiOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume)
+UINT midiOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "midiOutGetVolume(%04X, %p);\n", uDeviceID, lpdwVolume);
 	return modMessage(uDeviceID, MODM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -1043,7 +1043,7 @@
 * 				midiOutCachePatches		[MMSYSTEM.213]
 */
 UINT midiOutCachePatches(HMIDIOUT hMidiOut,
-    UINT uBank, WORD FAR* lpwPatchArray, UINT uFlags)
+    UINT uBank, WORD * lpwPatchArray, UINT uFlags)
 {
         /* not really necessary to support this */
 	fprintf(stdnimp, "midiOutCachePatches: not supported yet\n");
@@ -1054,7 +1054,7 @@
 * 				midiOutCacheDrumPatches	[MMSYSTEM.214]
 */
 UINT midiOutCacheDrumPatches(HMIDIOUT hMidiOut,
-    UINT uPatch, WORD FAR* lpwKeyArray, UINT uFlags)
+    UINT uPatch, WORD * lpwKeyArray, UINT uFlags)
 {
 	fprintf(stdnimp, "midiOutCacheDrumPatchesi: not supported yet\n");
 	return MMSYSERR_NOTSUPPORTED;
@@ -1063,7 +1063,7 @@
 /**************************************************************************
 * 				midiOutGetID		[MMSYSTEM.215]
 */
-UINT midiOutGetID(HMIDIOUT hMidiOut, UINT FAR* lpuDeviceID)
+UINT midiOutGetID(HMIDIOUT hMidiOut, UINT * lpuDeviceID)
 {
 	dprintf_mmsys(stddeb, "midiOutGetID\n");
 	return 0;
@@ -1118,7 +1118,7 @@
 /**************************************************************************
 * 				midiInOpen		[MMSYSTEM.304]
 */
-UINT midiInOpen(HMIDIIN FAR* lphMidiIn, UINT uDeviceID,
+UINT midiInOpen(HMIDIIN * lphMidiIn, UINT uDeviceID,
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HMIDI	hMidiIn;
@@ -1169,7 +1169,7 @@
 * 				midiInPrepareHeader	[MMSYSTEM.306]
 */
 UINT midiInPrepareHeader(HMIDIIN hMidiIn,
-    MIDIHDR FAR* lpMidiInHdr, UINT uSize)
+    MIDIHDR * lpMidiInHdr, UINT uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInPrepareHeader(%04X, %p, %d)\n", 
@@ -1184,7 +1184,7 @@
 * 				midiInUnprepareHeader	[MMSYSTEM.307]
 */
 UINT midiInUnprepareHeader(HMIDIIN hMidiIn,
-    MIDIHDR FAR* lpMidiInHdr, UINT uSize)
+    MIDIHDR * lpMidiInHdr, UINT uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInUnprepareHeader(%04X, %p, %d)\n", 
@@ -1199,7 +1199,7 @@
 * 				midiInAddBuffer		[MMSYSTEM.308]
 */
 UINT midiInAddBuffer(HMIDIIN hMidiIn,
-    MIDIHDR FAR* lpMidiInHdr, UINT uSize)
+    MIDIHDR * lpMidiInHdr, UINT uSize)
 {
 	dprintf_mmsys(stddeb, "midiInAddBuffer\n");
 	return 0;
@@ -1235,7 +1235,7 @@
 /**************************************************************************
 * 				midiInGetID			[MMSYSTEM.312]
 */
-UINT midiInGetID(HMIDIIN hMidiIn, UINT FAR* lpuDeviceID)
+UINT midiInGetID(HMIDIIN hMidiIn, UINT * lpuDeviceID)
 {
 	dprintf_mmsys(stddeb, "midiInGetID\n");
 	return 0;
@@ -1271,7 +1271,7 @@
 /**************************************************************************
 * 				waveOutGetDevCaps		[MMSYSTEM.402]
 */
-UINT waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS FAR* lpCaps, UINT uSize)
+UINT waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS * lpCaps, UINT uSize)
 {
 	dprintf_mmsys(stddeb, "waveOutGetDevCaps\n");
 	return wodMessage(uDeviceID, WODM_GETDEVCAPS, 0L, (DWORD)lpCaps, uSize);
@@ -1356,7 +1356,7 @@
 /**************************************************************************
 * 				waveOutOpen			[MMSYSTEM.404]
 */
-UINT waveOutOpen(HWAVEOUT FAR* lphWaveOut, UINT uDeviceID,
+UINT waveOutOpen(HWAVEOUT * lphWaveOut, UINT uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HWAVE	hWaveOut;
@@ -1415,7 +1415,7 @@
 * 				waveOutPrepareHeader	[MMSYSTEM.406]
 */
 UINT waveOutPrepareHeader(HWAVEOUT hWaveOut,
-     WAVEHDR FAR* lpWaveOutHdr, UINT uSize)
+     WAVEHDR * lpWaveOutHdr, UINT uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutPrepareHeader(%04X, %p, %u);\n", 
@@ -1430,7 +1430,7 @@
 * 				waveOutUnprepareHeader	[MMSYSTEM.407]
 */
 UINT waveOutUnprepareHeader(HWAVEOUT hWaveOut,
-    WAVEHDR FAR* lpWaveOutHdr, UINT uSize)
+    WAVEHDR * lpWaveOutHdr, UINT uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutUnprepareHeader(%04X, %p, %u);\n", 
@@ -1444,7 +1444,7 @@
 /**************************************************************************
 * 				waveOutWrite		[MMSYSTEM.408]
 */
-UINT waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr,  UINT uSize)
+UINT waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR * lpWaveOutHdr,  UINT uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutWrite(%04X, %p, %u);\n", hWaveOut, lpWaveOutHdr, uSize);
@@ -1493,7 +1493,7 @@
 /**************************************************************************
 * 				waveOutGetPosition	[MMSYSTEM.412]
 */
-UINT waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME FAR* lpTime, UINT uSize)
+UINT waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME * lpTime, UINT uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut, lpTime, uSize);
@@ -1506,7 +1506,7 @@
 /**************************************************************************
 * 				waveOutGetPitch		[MMSYSTEM.413]
 */
-UINT waveOutGetPitch(HWAVEOUT hWaveOut, DWORD FAR* lpdwPitch)
+UINT waveOutGetPitch(HWAVEOUT hWaveOut, DWORD * lpdwPitch)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPitch(%04X, %p);\n", hWaveOut, lpdwPitch);
@@ -1531,7 +1531,7 @@
 /**************************************************************************
 * 				waveOutGetVolume	[MMSYSTEM.415]
 */
-UINT waveOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume)
+UINT waveOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "waveOutGetVolume(%04X, %p);\n", uDeviceID, lpdwVolume);
 	return wodMessage(uDeviceID, WODM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -1549,7 +1549,7 @@
 /**************************************************************************
 * 				waveOutGetPlaybackRate	[MMSYSTEM.417]
 */
-UINT waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD FAR* lpdwRate)
+UINT waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD * lpdwRate)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut, lpdwRate);
@@ -1584,7 +1584,7 @@
 /**************************************************************************
 * 				waveOutGetID	 	[MMSYSTEM.420]
 */
-UINT waveOutGetID(HWAVEOUT hWaveOut, UINT FAR* lpuDeviceID)
+UINT waveOutGetID(HWAVEOUT hWaveOut, UINT * lpuDeviceID)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetID(%04X, %p);\n", hWaveOut, lpuDeviceID);
@@ -1627,7 +1627,7 @@
 /**************************************************************************
 * 				waveInGetDevCaps 		[MMSYSTEM.502]
 */
-UINT waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS FAR* lpCaps, UINT uSize)
+UINT waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS * lpCaps, UINT uSize)
 {
 	dprintf_mmsys(stddeb, "waveInGetDevCaps\n");
 	return widMessage(uDeviceID, WIDM_GETDEVCAPS, 0L, (DWORD)lpCaps, uSize);
@@ -1647,7 +1647,7 @@
 /**************************************************************************
 * 				waveInOpen			[MMSYSTEM.504]
 */
-UINT waveInOpen(HWAVEIN FAR* lphWaveIn, UINT uDeviceID,
+UINT waveInOpen(HWAVEIN * lphWaveIn, UINT uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HWAVE	hWaveIn;
@@ -1708,7 +1708,7 @@
 * 				waveInPrepareHeader		[MMSYSTEM.506]
 */
 UINT waveInPrepareHeader(HWAVEIN hWaveIn,
-    WAVEHDR FAR* lpWaveInHdr, UINT uSize)
+    WAVEHDR * lpWaveInHdr, UINT uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -1731,7 +1731,7 @@
 * 				waveInUnprepareHeader	[MMSYSTEM.507]
 */
 UINT waveInUnprepareHeader(HWAVEIN hWaveIn,
-    WAVEHDR FAR* lpWaveInHdr, UINT uSize)
+    WAVEHDR * lpWaveInHdr, UINT uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -1753,7 +1753,7 @@
 * 				waveInAddBuffer		[MMSYSTEM.508]
 */
 UINT waveInAddBuffer(HWAVEIN hWaveIn,
-    WAVEHDR FAR* lpWaveInHdr, UINT uSize)
+    WAVEHDR * lpWaveInHdr, UINT uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -1813,7 +1813,7 @@
 /**************************************************************************
 * 				waveInGetPosition	[MMSYSTEM.512]
 */
-UINT waveInGetPosition(HWAVEIN hWaveIn, MMTIME FAR* lpTime, UINT uSize)
+UINT waveInGetPosition(HWAVEIN hWaveIn, MMTIME * lpTime, UINT uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInGetPosition(%04X, %p, %u);\n", hWaveIn, lpTime, uSize);
@@ -1827,7 +1827,7 @@
 /**************************************************************************
 * 				waveInGetID			[MMSYSTEM.513]
 */
-UINT waveInGetID(HWAVEIN hWaveIn, UINT FAR* lpuDeviceID)
+UINT waveInGetID(HWAVEIN hWaveIn, UINT * lpuDeviceID)
 {
 	dprintf_mmsys(stddeb, "waveInGetID\n");
 	if (lpuDeviceID == NULL) return MMSYSERR_INVALPARAM;
@@ -1853,7 +1853,7 @@
 /**************************************************************************
 * 				mmioOpen       		[MMSYSTEM.1210]
 */
-HMMIO mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo, DWORD dwOpenFlags)
+HMMIO mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo, DWORD dwOpenFlags)
 {
 	int		hFile;
 	HANDLE		hmmio;
@@ -1862,13 +1862,13 @@
 	dprintf_mmsys(stddeb, "mmioOpen('%s', %p, %08lX);\n", szFileName, lpmmioinfo, dwOpenFlags);
 	hFile = OpenFile(szFileName, &ofs, dwOpenFlags);
 	if (hFile == -1) return 0;
-	hmmio = GlobalAlloc(GMEM_MOVEABLE, sizeof(MMIOINFO));
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	hmmio = GlobalAlloc16(GMEM_MOVEABLE, sizeof(MMIOINFO));
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	memset(lpmminfo, 0, sizeof(MMIOINFO));
 	lpmminfo->hmmio = hmmio;
 	lpmminfo->dwReserved2 = MAKELONG(hFile, 0);
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	dprintf_mmsys(stddeb, "mmioOpen // return hmmio=%04X\n", hmmio);
 	return hmmio;
 }
@@ -1881,11 +1881,11 @@
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioClose(%04X, %04X);\n", hmmio, uFlags);
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	_lclose(LOWORD(lpmminfo->dwReserved2));
-	GlobalUnlock(hmmio);
-	GlobalFree(hmmio);
+	GlobalUnlock16(hmmio);
+	GlobalFree16(hmmio);
 	return 0;
 }
 
@@ -1899,10 +1899,10 @@
 	LONG		count;
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmio(stddeb, "mmioRead(%04X, %p, %ld);\n", hmmio, pch, cch);
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	count = FILE_Read(LOWORD(lpmminfo->dwReserved2), pch, cch);
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	dprintf_mmio(stddeb, "mmioRead // count=%ld\n", count);
 	return count;
 }
@@ -1917,10 +1917,10 @@
 	LONG		count;
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioWrite(%04X, %p, %ld);\n", hmmio, pch, cch);
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	count = _lwrite(LOWORD(lpmminfo->dwReserved2), (LPSTR)pch, cch);
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	return count;
 }
 
@@ -1932,40 +1932,40 @@
 	int		count;
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioSeek(%04X, %08lX, %d);\n", hmmio, lOffset, iOrigin);
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) {
 		dprintf_mmsys(stddeb, "mmioSeek // can't lock hmmio=%04X !\n", hmmio);
 		return 0;
 		}
 	count = _llseek(LOWORD(lpmminfo->dwReserved2), lOffset, iOrigin);
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	return count;
 }
 
 /**************************************************************************
 * 				mmioGetInfo	       	[MMSYSTEM.1215]
 */
-UINT mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags)
+UINT mmioGetInfo(HMMIO hmmio, MMIOINFO * lpmmioinfo, UINT uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioGetInfo\n");
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	memcpy(lpmmioinfo, lpmminfo, sizeof(MMIOINFO));
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	return 0;
 }
 
 /**************************************************************************
 * 				mmioSetInfo    		[MMSYSTEM.1216]
 */
-UINT mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags)
+UINT mmioSetInfo(HMMIO hmmio, const MMIOINFO * lpmmioinfo, UINT uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioSetInfo\n");
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	return 0;
 }
 
@@ -1986,21 +1986,21 @@
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioFlush(%04X, %04X)\n", hmmio, uFlags);
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	return 0;
 }
 
 /**************************************************************************
 * 				mmioAdvance    		[MMSYSTEM.1219]
 */
-UINT mmioAdvance(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags)
+UINT mmioAdvance(HMMIO hmmio, MMIOINFO * lpmmioinfo, UINT uFlags)
 {
 	int		count = 0;
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioAdvance\n");
-	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	if (uFlags == MMIO_READ) {
 		count = FILE_Read(LOWORD(lpmminfo->dwReserved2), 
@@ -2011,7 +2011,7 @@
 			lpmmioinfo->pchBuffer, lpmmioinfo->cchBuffer);
 		}
 	lpmmioinfo->pchNext	+= count;
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	lpmminfo->lDiskOffset = _llseek(LOWORD(lpmminfo->dwReserved2), 0, SEEK_CUR);
 	return 0;
 }
@@ -2048,15 +2048,15 @@
 /**************************************************************************
 * 				mmioDescend	       	[MMSYSTEM.1223]
 */
-UINT mmioDescend(HMMIO hmmio, MMCKINFO FAR* lpck,
-		    const MMCKINFO FAR* lpckParent, UINT uFlags)
+UINT mmioDescend(HMMIO hmmio, MMCKINFO * lpck,
+		    const MMCKINFO * lpckParent, UINT 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)GlobalLock(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	dwfcc = lpck->ckid;
 	dprintf_mmio(stddeb, "mmioDescend // dwfcc=%08lX\n", dwfcc);
@@ -2074,7 +2074,7 @@
 			if (FILE_Read(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck, 
 					sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
 				_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
-				GlobalUnlock(hmmio);
+				GlobalUnlock16(hmmio);
 				return MMIOERR_CHUNKNOTFOUND;
 				}
 			dprintf_mmio(stddeb, "mmioDescend // dwfcc=%08lX ckid=%08lX cksize=%08lX !\n", 
@@ -2090,7 +2090,7 @@
 		if (FILE_Read(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck, 
 				sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
 			_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
-			GlobalUnlock(hmmio);
+			GlobalUnlock16(hmmio);
 			return MMIOERR_CHUNKNOTFOUND;
 			}
 		}
@@ -2099,7 +2099,7 @@
 		lpck->dwDataOffset += sizeof(DWORD);
 	lpmminfo->lDiskOffset = _llseek(LOWORD(lpmminfo->dwReserved2), 
 									lpck->dwDataOffset, SEEK_SET);
-	GlobalUnlock(hmmio);
+	GlobalUnlock16(hmmio);
 	dprintf_mmio(stddeb, "mmioDescend // lpck->ckid=%08lX lpck->cksize=%ld !\n", 
 								lpck->ckid, lpck->cksize);
 	dprintf_mmsys(stddeb, "mmioDescend // lpck->fccType=%08lX !\n", lpck->fccType);
@@ -2109,7 +2109,7 @@
 /**************************************************************************
 * 				mmioAscend     		[MMSYSTEM.1224]
 */
-UINT mmioAscend(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags)
+UINT mmioAscend(HMMIO hmmio, MMCKINFO * lpck, UINT uFlags)
 {
 	dprintf_mmsys(stddeb, "mmioAscend // empty stub !\n");
 	return 0;
@@ -2118,7 +2118,7 @@
 /**************************************************************************
 * 				mmioCreateChunk		[MMSYSTEM.1225]
 */
-UINT mmioCreateChunk(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags)
+UINT mmioCreateChunk(HMMIO hmmio, MMCKINFO * lpck, UINT uFlags)
 {
 	dprintf_mmsys(stddeb, "mmioCreateChunk // empty stub \n");
 	return 0;
@@ -2129,7 +2129,7 @@
 * 				mmioRename     		[MMSYSTEM.1226]
 */
 UINT mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
-     MMIOINFO FAR* lpmmioinfo, DWORD dwRenameFlags)
+     MMIOINFO * lpmmioinfo, DWORD dwRenameFlags)
 {
 	dprintf_mmsys(stddeb, "mmioRename('%s', '%s', %p, %08lX); // empty stub \n",
 			szFileName, szNewFileName, lpmmioinfo, dwRenameFlags);
diff --git a/objects/brush.c b/objects/brush.c
index cd55bd3..e5ee9b0 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -200,7 +200,7 @@
 
       /* Make a copy of the bitmap */
 
-    if (!(info = (BITMAPINFO *) GlobalLock( hbitmap ))) return 0;
+    if (!(info = (BITMAPINFO *) GlobalLock16( hbitmap ))) return 0;
 
     size = info->bmiHeader.biSizeImage;
     if (!size)
@@ -208,15 +208,15 @@
 	         * 8 * info->bmiHeader.biHeight;
     size += DIB_BitmapInfoSize( info, coloruse );
 
-    if (!(logbrush.lbHatch = (INT)GlobalAlloc( GMEM_MOVEABLE, size )))
+    if (!(logbrush.lbHatch = (INT)GlobalAlloc16( GMEM_MOVEABLE, size )))
     {
-	GlobalUnlock( hbitmap );
+	GlobalUnlock16( hbitmap );
 	return 0;
     }
-    newInfo = (BITMAPINFO *) GlobalLock( (HANDLE)logbrush.lbHatch );
+    newInfo = (BITMAPINFO *) GlobalLock16( (HANDLE)logbrush.lbHatch );
     memcpy( newInfo, info, size );
-    GlobalUnlock( (HANDLE)logbrush.lbHatch );
-    GlobalUnlock( hbitmap );
+    GlobalUnlock16( (HANDLE)logbrush.lbHatch );
+    GlobalUnlock16( hbitmap );
     return CreateBrushIndirect( &logbrush );
 }
 
@@ -265,7 +265,7 @@
 	  DeleteObject( (HANDLE)brush->logbrush.lbHatch );
 	  break;
       case BS_DIBPATTERN:
-	  GlobalFree( (HANDLE)brush->logbrush.lbHatch );
+	  GlobalFree16( (HANDLE)brush->logbrush.lbHatch );
 	  break;
     }
     return GDI_FreeObject( hbrush );
@@ -397,7 +397,7 @@
 
       case BS_DIBPATTERN:
 	dprintf_gdi( stddeb, "BS_DIBPATTERN\n");
-	if ((bmpInfo = (BITMAPINFO *) GlobalLock( (HANDLE)brush->logbrush.lbHatch )))
+	if ((bmpInfo = (BITMAPINFO *) GlobalLock16( (HANDLE)brush->logbrush.lbHatch )))
 	{
 	    int size = DIB_BitmapInfoSize( bmpInfo, brush->logbrush.lbColor );
 	    hBitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
@@ -405,7 +405,7 @@
 				      (WORD) brush->logbrush.lbColor );
 	    BRUSH_SelectPatternBrush( dc, hBitmap );
 	    DeleteObject( hBitmap );
-	    GlobalUnlock( (HANDLE)brush->logbrush.lbHatch );	    
+	    GlobalUnlock16( (HANDLE)brush->logbrush.lbHatch );	    
 	}
 	
 	break;
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index b645f0e..7668967 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -331,8 +331,8 @@
     sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
     sizeAnd = bmpAnd->bitmap.bmHeight * bmpAnd->bitmap.bmWidthBytes;
 
-    if (!(handle = GlobalAlloc( GMEM_MOVEABLE,
-                                sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
+    if (!(handle = GlobalAlloc16( GMEM_MOVEABLE,
+                                  sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
     {
         DeleteObject( hXorBits );
         DeleteObject( hAndBits );
@@ -342,7 +342,7 @@
     /* Make it owned by the module */
     if (hInstance) FarSetOwner( handle, GetExePtr(hInstance) );
 
-    info = (CURSORICONINFO *)GlobalLock( handle );
+    info = (CURSORICONINFO *)GlobalLock16( handle );
     info->ptHotSpot.x   = hotspot.x;
     info->ptHotSpot.y   = hotspot.y;
     info->nWidth        = bmpXor->bitmap.bmWidth;
@@ -357,7 +357,7 @@
     GetBitmapBits( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
     DeleteObject( hXorBits );
     DeleteObject( hAndBits );
-    GlobalUnlock( handle );
+    GlobalUnlock16( handle );
     return handle;
 }
 
@@ -413,15 +413,15 @@
     int size;
     HANDLE hNew;
 
-    if (!(ptrOld = (char *)GlobalLock( handle ))) return 0;
+    if (!(ptrOld = (char *)GlobalLock16( handle ))) return 0;
     if (!(hInstance = GetExePtr( hInstance ))) return 0;
-    size = GlobalSize( handle );
-    hNew = GlobalAlloc( GMEM_MOVEABLE, size );
+    size = GlobalSize16( handle );
+    hNew = GlobalAlloc16( GMEM_MOVEABLE, size );
     FarSetOwner( hNew, hInstance );
-    ptrNew = (char *)GlobalLock( hNew );
+    ptrNew = (char *)GlobalLock16( hNew );
     memcpy( ptrNew, ptrOld, size );
-    GlobalUnlock( handle );
-    GlobalUnlock( hNew );
+    GlobalUnlock16( handle );
+    GlobalUnlock16( hNew );
     return hNew;
 }
 
@@ -437,7 +437,7 @@
  CURSORICONINFO *ptr = NULL;
 
  if(hIcon)
-    if (!(ptr = (CURSORICONINFO*)GlobalLock( hIcon ))) return FALSE;
+    if (!(ptr = (CURSORICONINFO*)GlobalLock16( hIcon ))) return FALSE;
        if (ptr->bPlanes * ptr->bBitsPerPixel == 1)
           {
             return hIcon; /* assuming it's a cursor */
@@ -447,7 +447,7 @@
 	   /* kludge */
 
 	   HTASK hTask = GetCurrentTask();
-	   TDB*  pTask = (TDB *)GlobalLock(hTask);
+	   TDB*  pTask = (TDB *)GlobalLock16(hTask);
 
 	   if(!pTask) return 0;
 
@@ -542,11 +542,11 @@
     if (!(handle = DirectResAlloc(hInstance, 0x10,
                                   sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
         return 0;
-    ptr = (char *)GlobalLock( handle );
+    ptr = (char *)GlobalLock16( handle );
     memcpy( ptr, info, sizeof(*info) );
     memcpy( ptr + sizeof(CURSORICONINFO), lpANDbits, sizeAnd );
     memcpy( ptr + sizeof(CURSORICONINFO) + sizeAnd, lpXORbits, sizeXor );
-    GlobalUnlock( handle );
+    GlobalUnlock16( handle );
     return handle;
 }
 
@@ -594,7 +594,7 @@
 {
     dprintf_icon( stddeb, "DestroyIcon: %04x\n", hIcon );
     /* FIXME: should check for OEM icon here */
-    return (GlobalFree( hIcon ) != 0);
+    return (GlobalFree16( hIcon ) != 0);
 }
 
 
@@ -605,7 +605,7 @@
 {
     dprintf_cursor( stddeb, "DestroyCursor: %04x\n", hCursor );
     /* FIXME: should check for OEM cursor here */
-    return (GlobalFree( hCursor ) != 0);
+    return (GlobalFree16( hCursor ) != 0);
 }
 
 
@@ -619,7 +619,7 @@
     HBITMAP hXorBits, hAndBits;
     COLORREF oldFg, oldBg;
 
-    if (!(ptr = (CURSORICONINFO *)GlobalLock( hIcon ))) return FALSE;
+    if (!(ptr = (CURSORICONINFO *)GlobalLock16( hIcon ))) return FALSE;
     if (!(hMemDC = CreateCompatibleDC( hdc ))) return FALSE;
     hAndBits = CreateBitmap( ptr->nWidth, ptr->nHeight, 1, 1, (char *)(ptr+1));
     hXorBits = CreateBitmap( ptr->nWidth, ptr->nHeight, ptr->bPlanes,
@@ -639,7 +639,7 @@
     DeleteDC( hMemDC );
     if (hXorBits) DeleteObject( hXorBits );
     if (hAndBits) DeleteObject( hAndBits );
-    GlobalUnlock( hIcon );
+    GlobalUnlock16( hIcon );
     SetTextColor( hdc, oldFg );
     SetBkColor( hdc, oldBg );
     return TRUE;
@@ -694,7 +694,7 @@
         CURSORICONINFO *ptr;
         XImage *image;
 
-        if (!(ptr = (CURSORICONINFO*)GlobalLock( hCursor ))) return FALSE;
+        if (!(ptr = (CURSORICONINFO*)GlobalLock16( hCursor ))) return FALSE;
         if (ptr->bPlanes * ptr->bBitsPerPixel != 1)
         {
             fprintf( stderr, "Cursor %04x has more than 1 bpp!\n", hCursor );
@@ -778,7 +778,7 @@
         if (pixmapAll) XFreePixmap( display, pixmapAll );
         if (pixmapBits) XFreePixmap( display, pixmapBits );
         if (pixmapMask) XFreePixmap( display, pixmapMask );
-        GlobalUnlock( hCursor );
+        GlobalUnlock16( hCursor );
     }
 
     if (cursor == None) return FALSE;
diff --git a/objects/dc.c b/objects/dc.c
index d2ee88c..8094756 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -456,7 +456,7 @@
 /***********************************************************************
  *           CreateDC    (GDI.53)
  */
-HDC CreateDC( LPCTSTR driver, LPCTSTR device, LPCTSTR output, const DEVMODE* initData )
+HDC CreateDC( LPCSTR driver, LPCSTR device, LPCSTR output, const DEVMODE* initData )
 {
     DC * dc;
     HANDLE handle;
@@ -500,7 +500,7 @@
 /***********************************************************************
  *           CreateIC    (GDI.153)
  */
-HDC CreateIC( LPCTSTR driver, LPCTSTR device, LPCTSTR output, const DEVMODE* initData )
+HDC CreateIC( LPCSTR driver, LPCSTR device, LPCSTR output, const DEVMODE* initData )
 {
       /* Nothing special yet for ICs */
     return CreateDC( driver, device, output, initData );
diff --git a/objects/font.c b/objects/font.c
index e1e1bb0..7917a53 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -695,7 +695,7 @@
 /***********************************************************************
  *           GetCharWidth    (GDI.350)
  */
-BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT lpBuffer)
+BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT16 lpBuffer)
 {
     int i, j;
     XFontStruct *xfont;
@@ -857,7 +857,7 @@
 /*************************************************************************
  *				EnumFonts			[GDI.70]
  */
-INT EnumFonts(HDC hDC, LPCTSTR lpFaceName, FONTENUMPROC lpEnumFunc, LPARAM lpData)
+INT EnumFonts(HDC hDC, LPCSTR lpFaceName, FONTENUMPROC lpEnumFunc, LPARAM lpData)
 {
   HANDLE       hLog;
   HANDLE       hMet;
@@ -927,7 +927,7 @@
 /*************************************************************************
  *				EnumFontFamilies	[GDI.330]
  */
-INT EnumFontFamilies(HDC hDC, LPCTSTR lpszFamily, FONTENUMPROC lpEnumFunc, LPARAM lpData)
+INT EnumFontFamilies(HDC hDC, LPCSTR lpszFamily, FONTENUMPROC lpEnumFunc, LPARAM lpData)
 {
   HANDLE       	hLog;
   HANDLE       	hMet;
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index d677e5d..e957f7e 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -442,3 +442,34 @@
     /* FIXME: should check magic here */
     return (object != NULL);
 }
+
+
+/***********************************************************************
+ *           MulDiv16   (GDI.128)
+ */
+INT16 MulDiv16( INT16 foo, INT16 bar, INT16 baz )
+{
+    INT32 ret;
+    if (!baz) return -32768;
+    ret = (foo * bar) / baz;
+    if ((ret > 32767) || (ret < -32767)) return -32768;
+    return ret;
+}
+
+
+/***********************************************************************
+ *           MulDiv32   (KERNEL32.391)
+ */
+INT32 MulDiv32( INT32 foo, INT32 bar, INT32 baz )
+{
+#ifdef __GNUC__
+    long long ret;
+    if (!baz) return -1;
+    ret = ((long long)foo * bar) / baz;
+    if ((ret > 2147483647) || (ret < -2147483647)) return -1;
+    return ret;
+#else
+    if (!baz) return -1;
+    return (foo * bar) / baz;
+#endif
+}
diff --git a/objects/metafile.c b/objects/metafile.c
index 8cb460e..6ca814a 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -37,48 +37,48 @@
   if (!lpFilename)
     return 0;
 
-  hmf = GlobalAlloc(GMEM_MOVEABLE, MFHEADERSIZE);
-  mh = (METAHEADER *)GlobalLock(hmf);
+  hmf = GlobalAlloc16(GMEM_MOVEABLE, MFHEADERSIZE);
+  mh = (METAHEADER *)GlobalLock16(hmf);
   
   if (!mh) {
-    GlobalFree(hmf);
+    GlobalFree16(hmf);
     return 0;
   }
   
   if ((hFile = _lopen(lpFilename, OF_READ)) == HFILE_ERROR) {
-    GlobalFree(hmf);
+    GlobalFree16(hmf);
     return 0;
   }
   
   if (FILE_Read(hFile, (char *)mh, MFHEADERSIZE) == HFILE_ERROR) {
-    GlobalFree(hmf);
+    GlobalFree16(hmf);
     return 0;
   }
   
   size = mh->mtSize * 2;         /* alloc memory for whole metafile */
-  GlobalUnlock(hmf);
-  hmf = GlobalReAlloc(hmf,size,GMEM_MOVEABLE);
-  mh = (METAHEADER *)GlobalLock(hmf);
+  GlobalUnlock16(hmf);
+  hmf = GlobalReAlloc16(hmf,size,GMEM_MOVEABLE);
+  mh = (METAHEADER *)GlobalLock16(hmf);
   
   if (!mh) {
-    GlobalFree(hmf);
+    GlobalFree16(hmf);
     return 0;
   }
   
   if (FILE_Read(hFile, (char*)mh + mh->mtHeaderSize * 2, 
 	        size - mh->mtHeaderSize * 2) == HFILE_ERROR) {
-    GlobalFree(hmf);
+    GlobalFree16(hmf);
     return 0;
   }
   
   _lclose(hFile);
 
   if (mh->mtType != 1) {
-    GlobalFree(hmf);
+    GlobalFree16(hmf);
     return 0;
   }
   
-  GlobalUnlock(hmf);
+  GlobalUnlock16(hmf);
   return hmf;
 
 }
@@ -87,7 +87,7 @@
  *         CreateMetafile         GDI.125
  */
 
-HANDLE CreateMetaFile(LPCTSTR lpFilename)
+HANDLE CreateMetaFile(LPCSTR lpFilename)
 {
     DC *dc;
     HANDLE handle;
@@ -103,12 +103,12 @@
     
     dc = (DC *)GDI_HEAP_LIN_ADDR(handle);
 
-    if (!(dc->w.hMetaFile = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAHEADER)))) {
+    if (!(dc->w.hMetaFile = GlobalAlloc16(GMEM_MOVEABLE, sizeof(METAHEADER)))) {
         GDI_FreeObject(handle);
 	return 0;
     }
     
-    mh = (METAHEADER *)GlobalLock(dc->w.hMetaFile);
+    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
 
     mh->mtHeaderSize = MFHEADERSIZE / 2;
     mh->mtVersion = MFVERSION;
@@ -123,7 +123,7 @@
 	hFile = _lcreat(lpFilename, 0);
 	if (_lwrite(hFile, (char *)mh, MFHEADERSIZE) == -1)
 	{
-	    GlobalFree(dc->w.hMetaFile);
+	    GlobalFree16(dc->w.hMetaFile);
 	    return 0;
 	}
 	mh->mtNoParameters = hFile; /* store file descriptor here */
@@ -134,10 +134,10 @@
 
     /* create the handle table */
     HTLen = HTINCR;
-    hHT = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 
+    hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT, 
 		      sizeof(HANDLETABLE) * HTLen);
     
-    GlobalUnlock(dc->w.hMetaFile);
+    GlobalUnlock16(dc->w.hMetaFile);
     dprintf_metafile(stddeb,"CreateMetaFile: returning %04x\n", handle);
     return handle;
 }
@@ -156,7 +156,7 @@
     
     dprintf_metafile(stddeb,"CopyMetaFile: %s\n", lpFilename);
     
-    mh = (METAHEADER *)GlobalLock(hSrcMetaFile);
+    mh = (METAHEADER *)GlobalLock16(hSrcMetaFile);
     
     if (!mh)
       return 0;
@@ -173,10 +173,10 @@
         }
     else                     /* memory based metafile */
         {
-	handle = GlobalAlloc(GMEM_MOVEABLE,mh->mtSize * 2);
-	mh2 = (METAHEADER *)GlobalLock(handle);
+	handle = GlobalAlloc16(GMEM_MOVEABLE,mh->mtSize * 2);
+	mh2 = (METAHEADER *)GlobalLock16(handle);
 	memcpy(mh2,mh, mh->mtSize * 2);
-	GlobalUnlock(handle);
+	GlobalUnlock16(handle);
         }
     
     return handle;
@@ -201,7 +201,7 @@
     if (!dc) 
       return 0;
     
-    mh = (METAHEADER *)GlobalLock(dc->w.hMetaFile);
+    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
 
     /* Construct the end of metafile record - this is documented
      * in SDK Knowledgebase Q99334.
@@ -209,7 +209,7 @@
 
     if (!MF_MetaParam0(dc, META_EOF))
     {
-	GlobalFree(dc->w.hMetaFile);
+	GlobalFree16(dc->w.hMetaFile);
 	return 0;
     }	
 
@@ -219,22 +219,22 @@
 	mh->mtNoParameters = 0;
         if (_llseek(hFile, 0L, 0) == -1)
         {
-            GlobalFree(dc->w.hMetaFile);
+            GlobalFree16(dc->w.hMetaFile);
             return 0;
         }
         if (_lwrite(hFile, (char *)mh, MFHEADERSIZE) == -1)
         {
-            GlobalFree(dc->w.hMetaFile);
+            GlobalFree16(dc->w.hMetaFile);
             return 0;
         }
         _lclose(hFile);
     }
 
     /* delete the handle table */
-    GlobalFree(hHT);
+    GlobalFree16(hHT);
 
     hmf = dc->w.hMetaFile;
-    GlobalUnlock(hmf);
+    GlobalUnlock16(hmf);
     GDI_FreeObject(hdc);
     return hmf;
 }
@@ -246,12 +246,12 @@
 
 BOOL DeleteMetaFile(HMETAFILE hmf)
 {
-    METAHEADER *mh = (METAHEADER *)GlobalLock(hmf);
+    METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
 
     if (!mh)
 	return FALSE;
 
-    GlobalFree(hmf);
+    GlobalFree16(hmf);
     return TRUE;
 }
 
@@ -262,7 +262,7 @@
 
 BOOL PlayMetaFile(HDC hdc, HMETAFILE hmf)
 {
-    METAHEADER *mh = (METAHEADER *)GlobalLock(hmf);
+    METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
     METARECORD *mr;
     HANDLETABLE *ht;
     int offset = 0;
@@ -271,9 +271,9 @@
     dprintf_metafile(stddeb,"PlayMetaFile(%04x %04x)\n",hdc,hmf);
     
     /* create the handle table */
-    hHT = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
+    hHT = GlobalAlloc16(GMEM_MOVEABLE|GMEM_ZEROINIT,
 		      sizeof(HANDLETABLE) * mh->mtNoObjects);
-    ht = (HANDLETABLE *)GlobalLock(hHT);
+    ht = (HANDLETABLE *)GlobalLock16(hHT);
 
     /* loop through metafile playing records */
     offset = mh->mtHeaderSize * 2;
@@ -292,7 +292,7 @@
         DeleteObject(*(ht->objectHandle + i));
     
     /* free handle table */
-    GlobalFree(hHT);
+    GlobalFree16(hHT);
 
     return TRUE;
 }
@@ -305,7 +305,7 @@
 
 BOOL EnumMetaFile(HDC hdc, HMETAFILE hmf, MFENUMPROC lpEnumFunc,LPARAM lpData)
 {
-    METAHEADER *mh = (METAHEADER *)GlobalLock(hmf);
+    METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
     METARECORD *mr;
     HANDLETABLE *ht;
     int offset = 0;
@@ -315,9 +315,9 @@
    
     /* create the handle table */
     
-    hHT = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,
+    hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT,
 		     sizeof(HANDLETABLE) * mh->mtNoObjects);
-    ht = (HANDLETABLE *)GlobalLock(hHT);
+    ht = (HANDLETABLE *)GlobalLock16(hHT);
    
     offset = mh->mtHeaderSize * 2;
     
@@ -335,7 +335,7 @@
     }
 
     /* free handle table */
-    GlobalFree(hHT);
+    GlobalFree16(hHT);
 
     return TRUE;
 }
@@ -515,7 +515,7 @@
 
     case META_POLYPOLYGON:
       PolyPolygon(hdc, (LPPOINT)(mr->rdParam + *(mr->rdParam) + 1),
-		  (LPINT)(mr->rdParam + 1), *(mr->rdParam)); 
+		  (LPINT16)(mr->rdParam + 1), *(mr->rdParam)); 
       break;
 
     case META_POLYLINE:
@@ -552,13 +552,13 @@
 
 	case BS_DIBPATTERN:
 	    s1 = mr->rdSize * 2 - sizeof(METARECORD) - 2;
-	    hndl = GlobalAlloc(GMEM_MOVEABLE, s1);
-	    ptr = GlobalLock(hndl);
+	    hndl = GlobalAlloc16(GMEM_MOVEABLE, s1);
+	    ptr = GlobalLock16(hndl);
 	    memcpy(ptr, mr->rdParam + 2, s1);
-	    GlobalUnlock(hndl);
+	    GlobalUnlock16(hndl);
 	    MF_AddHandle(ht, nHandles,
 			 CreateDIBPatternBrush(hndl, *(mr->rdParam + 1)));
-	    GlobalFree(hndl);
+	    GlobalFree16(hndl);
 	}
 	break;
 	
@@ -705,14 +705,14 @@
 HMETAFILE MF_WriteRecord(HMETAFILE hmf, METARECORD *mr, WORD rlen)
 {
     DWORD len;
-    METAHEADER *mh = (METAHEADER *)GlobalLock(hmf);
+    METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
     
     if (mh->mtType == 0)          /* memory based metafile */
     {
 	len = mh->mtSize * 2 + rlen;
-	GlobalUnlock(hmf);
-	hmf = GlobalReAlloc(hmf, len, GMEM_MOVEABLE); /* hmf can change */
-	mh = (METAHEADER *)GlobalLock(hmf);
+	GlobalUnlock16(hmf);
+	hmf = GlobalReAlloc16(hmf, len, GMEM_MOVEABLE); /* hmf can change */
+	mh = (METAHEADER *)GlobalLock16(hmf);
 	memcpy((WORD *)mh + mh->mtSize, mr, rlen);
     }
     else if (mh->mtType == 1)     /* disk based metafile */
@@ -720,19 +720,19 @@
       dprintf_metafile(stddeb,"Writing record to disk\n");
 	if (_lwrite(mh->mtNoParameters, (char *)mr, rlen) == -1)
 	{
-	    GlobalUnlock(hmf);
+	    GlobalUnlock16(hmf);
 	    return 0;
 	}
     }
     else
     {
-	GlobalUnlock(hmf);
+	GlobalUnlock16(hmf);
 	return 0;
     }
 
     mh->mtSize += rlen / 2;
     mh->mtMaxRecord = MAX(mh->mtMaxRecord, rlen / 2);
-    GlobalUnlock(hmf);
+    GlobalUnlock16(hmf);
     return hmf;
 }
 
@@ -768,24 +768,24 @@
 int MF_AddHandleInternal(HANDLE hobj)
 {
     int i;
-    HANDLETABLE *ht = (HANDLETABLE *)GlobalLock(hHT);
+    HANDLETABLE *ht = (HANDLETABLE *)GlobalLock16(hHT);
 
     for (i = 0; i < HTLen; i++)
     {
 	if (*(ht->objectHandle + i) == 0)
 	{
 	    *(ht->objectHandle + i) = hobj;
-	    GlobalUnlock(hHT);
+	    GlobalUnlock16(hHT);
 	    return i;
 	}
     }
-    GlobalUnlock(hHT);
-    if (!(hHT = GlobalReAlloc(hHT, HTINCR, GMEM_MOVEABLE | GMEM_ZEROINIT)))
+    GlobalUnlock16(hHT);
+    if (!(hHT = GlobalReAlloc16(hHT, HTINCR, GMEM_MOVEABLE | GMEM_ZEROINIT)))
 	return -1;
     HTLen += HTINCR;
-    ht = (HANDLETABLE *)GlobalLock(hHT);
+    ht = (HANDLETABLE *)GlobalLock16(hHT);
     *(ht->objectHandle + i) = hobj;
-    GlobalUnlock(hHT);
+    GlobalUnlock16(hHT);
     return i;
 }
 
@@ -951,12 +951,12 @@
     if ((index = MF_AddHandleInternal(hBrush)) == -1)
 	return FALSE;
 
-    mh = (METAHEADER *)GlobalLock(dc->w.hMetaFile);
+    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
     *(mr->rdParam) = index;
     if (index >= mh->mtNoObjects)
 	mh->mtNoObjects++;
     
-    GlobalUnlock(dc->w.hMetaFile);
+    GlobalUnlock16(dc->w.hMetaFile);
     handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
     dc->w.hMetaFile = handle;
 
@@ -988,9 +988,9 @@
 	if (!bmp) return FALSE;
 	len = sizeof(METARECORD) + sizeof(BITMAPINFOHEADER) + 
 	      (bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes) + 6;
-	if (!(hmr = GlobalAlloc(GMEM_MOVEABLE, len)))
+	if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len)))
 	    return FALSE;
-	mr = (METARECORD *)GlobalLock(hmr);
+	mr = (METARECORD *)GlobalLock16(hmr);
 	memset(mr, 0, len);
 	mr->rdFunction = META_DIBCREATEPATTERNBRUSH;
 	mr->rdSize = len / 2;
@@ -1008,16 +1008,16 @@
 	break;
 
     case BS_DIBPATTERN:
-	info = (BITMAPINFO *)GlobalLock((HANDLE)logbrush->lbHatch);
+	info = (BITMAPINFO *)GlobalLock16((HANDLE)logbrush->lbHatch);
 	bmSize = info->bmiHeader.biSizeImage;
 	if (!bmSize)
 	    bmSize = (info->bmiHeader.biWidth * info->bmiHeader.biBitCount 
 		    + 31) / 32 * 8 * info->bmiHeader.biHeight;
 	biSize = DIB_BitmapInfoSize(info, LOWORD(logbrush->lbColor)); 
 	len = sizeof(METARECORD) + biSize + bmSize + 2;
-	if (!(hmr = GlobalAlloc(GMEM_MOVEABLE, len)))
+	if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len)))
 	    return FALSE;
-	mr = (METARECORD *)GlobalLock(hmr);
+	mr = (METARECORD *)GlobalLock16(hmr);
 	memset(mr, 0, len);
 	mr->rdFunction = META_DIBCREATEPATTERNBRUSH;
 	mr->rdSize = len / 2;
@@ -1030,11 +1030,11 @@
     }
     if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, len)))
     {
-	GlobalFree(hmr);
+	GlobalFree16(hmr);
 	return FALSE;
     }
 
-    GlobalFree(hmr);
+    GlobalFree16(hmr);
     
     mr = (METARECORD *)&buffer;
     mr->rdSize = sizeof(METARECORD) / 2;
@@ -1042,11 +1042,11 @@
     if ((index = MF_AddHandleInternal(hBrush)) == -1)
 	return FALSE;
 
-    mh = (METAHEADER *)GlobalLock(dc->w.hMetaFile);
+    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
     *(mr->rdParam) = index;
     if (index >= mh->mtNoObjects)
 	mh->mtNoObjects++;
-    GlobalUnlock(dc->w.hMetaFile);
+    GlobalUnlock16(dc->w.hMetaFile);
     handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
     dc->w.hMetaFile = handle;
 
@@ -1079,11 +1079,11 @@
     if ((index = MF_AddHandleInternal(hPen)) == -1)
 	return FALSE;
 
-    mh = (METAHEADER *)GlobalLock(dc->w.hMetaFile);
+    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
     *(mr->rdParam) = index;
     if (index >= mh->mtNoObjects)
 	mh->mtNoObjects++;
-    GlobalUnlock(dc->w.hMetaFile);
+    GlobalUnlock16(dc->w.hMetaFile);
     handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
     dc->w.hMetaFile = handle;
     
@@ -1116,11 +1116,11 @@
     if ((index = MF_AddHandleInternal(hFont)) == -1)
 	return FALSE;
 
-    mh = (METAHEADER *)GlobalLock(dc->w.hMetaFile);
+    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
     *(mr->rdParam) = index;
     if (index >= mh->mtNoObjects)
 	mh->mtNoObjects++;
-    GlobalUnlock(dc->w.hMetaFile);
+    GlobalUnlock16(dc->w.hMetaFile);
     handle  = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
     dc->w.hMetaFile = handle;
     
@@ -1139,9 +1139,9 @@
     METARECORD *mr;
 
     len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 4;
-    if (!(hmr = GlobalAlloc(GMEM_MOVEABLE, len)))
+    if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len)))
 	return FALSE;
-    mr = (METARECORD *)GlobalLock(hmr);
+    mr = (METARECORD *)GlobalLock16(hmr);
     memset(mr, 0, len);
 
     mr->rdSize = len / 2;
@@ -1152,7 +1152,7 @@
     *(mr->rdParam + ((count + 1) >> 1) + 2) = x;
     handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
     dc->w.hMetaFile = handle;
-    GlobalFree(hmr);
+    GlobalFree16(hmr);
     return handle;
 }
 
@@ -1168,9 +1168,9 @@
     METARECORD *mr;
 
     len = sizeof(METARECORD) + (count * 4); 
-    if (!(hmr = GlobalAlloc(GMEM_MOVEABLE, len)))
+    if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len)))
 	return FALSE;
-    mr = (METARECORD *)GlobalLock(hmr);
+    mr = (METARECORD *)GlobalLock16(hmr);
     memset(mr, 0, len);
 
     mr->rdSize = len / 2;
@@ -1179,7 +1179,7 @@
     memcpy(mr->rdParam + 1, pt, count * 4);
     handle  = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
     dc->w.hMetaFile = handle;
-    GlobalFree(hmr);
+    GlobalFree16(hmr);
     return handle;
 }
 
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index 04867fa..ca330ce 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -442,15 +442,15 @@
     sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
     sizeAnd = bmpXor->bitmap.bmHeight * ((bmpXor->bitmap.bmWidth+15) / 16 * 2);
 
-    if (!(handle = GlobalAlloc( GMEM_MOVEABLE,
-                                sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
+    if (!(handle = GlobalAlloc16( GMEM_MOVEABLE,
+                                  sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
     {
         DeleteObject( hXorBits );
         DeleteObject( hAndBits );
         return 0;
     }
 
-    pInfo = (CURSORICONINFO *)GlobalLock( handle );
+    pInfo = (CURSORICONINFO *)GlobalLock16( handle );
     pInfo->ptHotSpot.x   = hotspot.x;
     pInfo->ptHotSpot.y   = hotspot.y;
     pInfo->nWidth        = bmpXor->bitmap.bmWidth;
diff --git a/objects/region.c b/objects/region.c
index f994a91..935b996 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -249,7 +249,7 @@
 /***********************************************************************
  *           CreatePolyPolygonRgn    (GDI.451)
  */
-HRGN CreatePolyPolygonRgn( const POINT * points, const INT * count,
+HRGN CreatePolyPolygonRgn( const POINT * points, const INT16 * count,
 			   INT nbpolygons, INT mode )
 {
     RGNOBJ * obj;
diff --git a/objects/text.c b/objects/text.c
index 6ad5d4e..3e62c84 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -184,7 +184,7 @@
 /***********************************************************************
  *           DrawText    (USER.85)
  */
-INT DrawText( HDC hdc, LPCTSTR str, INT i_count, LPRECT rect, UINT flags )
+INT DrawText( HDC hdc, LPCSTR str, INT i_count, LPRECT rect, UINT flags )
 {
     SIZE size;
     const char *strPtr;
@@ -286,7 +286,7 @@
  *           ExtTextOut    (GDI.351)
  */
 BOOL ExtTextOut( HDC hdc, short x, short y, WORD flags, LPRECT lprect,
-                 LPSTR str, WORD count, LPINT lpDx )
+                 LPSTR str, WORD count, LPINT16 lpDx )
 {
     int dir, ascent, descent, i;
     XCharStruct info;
@@ -518,7 +518,7 @@
  *       than TA_LEFT|TA_TOP. But we want bug-for-bug compatibility :-)
  */
 LONG TEXT_TabbedTextOut( HDC hdc, int x, int y, LPSTR lpstr, int count, 
-                         int cTabStops, LPINT lpTabPos, int nTabOrg,
+                         int cTabStops, LPINT16 lpTabPos, int nTabOrg,
                          BOOL fDisplayText)
 {
     WORD defWidth;
@@ -574,7 +574,7 @@
  *           TabbedTextOut    (USER.196)
  */
 LONG TabbedTextOut( HDC hdc, short x, short y, LPSTR lpstr, short count, 
-                    short cTabStops, LPINT lpTabPos, short nTabOrg )
+                    short cTabStops, LPINT16 lpTabPos, short nTabOrg )
 {
     dprintf_text( stddeb, "TabbedTextOut: %04x %d,%d '%*.*s' %d\n",
                   hdc, x, y, count, count, lpstr, count );
@@ -587,7 +587,7 @@
  *           GetTabbedTextExtent    (USER.197)
  */
 DWORD GetTabbedTextExtent( HDC hdc, LPSTR lpstr, int count, 
-                          int cTabStops, LPINT lpTabPos )
+                          int cTabStops, LPINT16 lpTabPos )
 {
     dprintf_text( stddeb, "GetTabbedTextExtent: %04x '%*.*s' %d\n",
                   hdc, count, count, lpstr, count );
diff --git a/programs/Makefile.in b/programs/Makefile.in
index a954a5f..c42928d 100644
--- a/programs/Makefile.in
+++ b/programs/Makefile.in
@@ -1,4 +1,4 @@
-SUBDIRS = progman
+SUBDIRS = progman winhelp
 
 all: $(SUBDIRS)
 
@@ -8,6 +8,9 @@
 depend:
 	for i in $(SUBDIRS); do (cd $$i; $(MAKE) depend); done
 
+install:
+	for i in $(SUBDIRS); do (cd $$i; $(MAKE) install); done
+
 clean:
 	for i in $(SUBDIRS); do (cd $$i; $(MAKE) clean); done
 
diff --git a/programs/progman/Makefile.in b/programs/progman/Makefile.in
index 37af394..8db65d2 100644
--- a/programs/progman/Makefile.in
+++ b/programs/progman/Makefile.in
@@ -6,6 +6,19 @@
 LANGUAGES   = En De Fr
 LICENSELANG = En
 
+# Installation infos
+
+INSTALL         = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA    = @INSTALL_DATA@
+prefix          = @prefix@
+exec_prefix     = @exec_prefix@
+bindir          = @bindir@
+libdir          = @libdir@
+sysconfdir      = @sysconfdir@
+mandir          = @mandir@/man1
+manext          = .1
+
 MOSTOBJS = \
 	dialog.o \
 	group.o \
@@ -30,10 +43,15 @@
 progman: $(MOSTOBJS) $(STRINGOBJS) $(WINELIB)
 	$(CC) -o progman $(MOSTOBJS) $(LDOPTIONS) $(ALL_LIBS) $(STRINGOBJS)
 
+install: dummy
+	$(INSTALL_PROGRAM) progman $(bindir)/progman
+
 clean::
 	$(RM) accel.c accel.h $(LANGUAGES:%=%.c) $(LANGUAGES:%=%.h) progman
 
 accel.c accel.h: $(WINERC) Xx.rc
 $(LANGUAGES:%=%.c) $(LANGUAGES:%=%.h): $(WINERC) Xx.rc
 
+dummy:
+
 ### Dependencies:
diff --git a/programs/winhelp/ChangeLog b/programs/winhelp/ChangeLog
new file mode 100644
index 0000000..9ba2f94
--- /dev/null
+++ b/programs/winhelp/ChangeLog
@@ -0,0 +1,7 @@
+Mon Apr 29 19:48:15 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>
+
+	* [winhelp.c] [winhelp.h] [hlpfile.c] [hlpfile.h]
+	[macro.c] [macro.h] [macro.lex.l] [macro.yacc.y]
+ 	[string.c] [En.rc] [De.rc] [Xx.rc] [hlp2sgml.c]
+	Original by Ulrich Schmid
+
diff --git a/programs/winhelp/De.rc b/programs/winhelp/De.rc
new file mode 100644
index 0000000..38a0c17
--- /dev/null
+++ b/programs/winhelp/De.rc
@@ -0,0 +1,48 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+/* This file is not yet complete !! */
+
+#define LANGUAGE_ID                  De
+#define LANGUAGE_NUMBER              2
+
+/* Menu */
+
+#define MENU_FILE                    "&Datei"
+#define MENU_FILE_OPEN               "Ö&ffnen..."
+#define MENU_FILE_PRINT              "Thema &drucken"
+#define MENU_FILE_PRINTER_SETUP      "Drucker&einrichtung..."
+#define MENU_FILE_EXIT               "&Beenden"
+
+#define MENU_EDIT                    "&Bearbeiten"
+#define MENU_EDIT_COPY_DIALOG        "&Kopieren..."
+#define MENU_EDIT_ANNOTATE           "&Anmerken..."
+
+#define MENU_BOOKMARK                "&Lesezeichen"
+#define MENU_BOOKMARK_DEFINE         "&Definieren..."
+
+#define MENU_HELP                    "&Hilfe"
+#define MENU_HELP_ON_HELP            "&Hilfe benutzen"
+#define MENU_HELP_ON_TOP             "Immer im &Vordergrund"
+#define MENU_HELP_INFO               "Inf&o..."
+#define MENU_HELP_ABOUT_WINE         "&Über WINE"
+
+/* Strings */
+
+#define STRING_WINE_HELP             "WINE Hilfe"
+#define STRING_ERROR                 "FEHLER"
+#define STRING_WARNING               "ACHTUNG"
+#define STRING_INFO                  "Information"
+#define STRING_NOT_IMPLEMENTED       "Nicht implementiert"
+#define STRING_HLPFILE_ERROR_s       "Fehler beim Lesen der Hilfe-Datei `%s'"
+#define STRING_CONTENTS              "&Inhalt"
+#define STRING_SEARCH                "&Suchen"
+#define STRING_BACK                  "&Zurück"
+#define STRING_HISTORY               "&Bisher"
+#define STRING_ALL_FILES             "Alle Dateien (*.*)"
+#define STRING_HELP_FILES_HLP        "Hilfe-Dateien (*.hlp)"
+
+#include "Xx.rc"
diff --git a/programs/winhelp/En.rc b/programs/winhelp/En.rc
new file mode 100644
index 0000000..b14389b
--- /dev/null
+++ b/programs/winhelp/En.rc
@@ -0,0 +1,48 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+/* This file is not yet complete !! */
+
+#define LANGUAGE_ID                  En
+#define LANGUAGE_NUMBER              0
+
+/* Menu */
+
+#define MENU_FILE                    "&File"
+#define MENU_FILE_OPEN               "&Open..."
+#define MENU_FILE_PRINT              "&Print"
+#define MENU_FILE_PRINTER_SETUP      "Printer &setup..."
+#define MENU_FILE_EXIT               "&Exit"
+
+#define MENU_EDIT                    "&Edit"
+#define MENU_EDIT_COPY_DIALOG        "&Copy..."
+#define MENU_EDIT_ANNOTATE           "&Annotate..."
+
+#define MENU_BOOKMARK                "&Bookmark"
+#define MENU_BOOKMARK_DEFINE         "&Define..."
+
+#define MENU_HELP                    "&Help"
+#define MENU_HELP_ON_HELP            "Help &on help"
+#define MENU_HELP_ON_TOP             "Always on &top"
+#define MENU_HELP_INFO               "&Info..."
+#define MENU_HELP_ABOUT_WINE         "&About WINE"
+
+/* Strings */
+
+#define STRING_WINE_HELP             "WINE Help"
+#define STRING_ERROR                 "ERROR"
+#define STRING_WARNING               "WARNING"
+#define STRING_INFO                  "Information"
+#define STRING_NOT_IMPLEMENTED       "Not implemented"
+#define STRING_HLPFILE_ERROR_s       "Error while reading the help file `%s'"
+#define STRING_CONTENTS              "&Contents"
+#define STRING_SEARCH                "&Search"
+#define STRING_BACK                  "&Back"
+#define STRING_HISTORY               "&History"
+#define STRING_ALL_FILES             "All files (*.*)"
+#define STRING_HELP_FILES_HLP        "Help files (*.hlp)"
+
+#include "Xx.rc"
diff --git a/programs/winhelp/Makefile.in b/programs/winhelp/Makefile.in
new file mode 100644
index 0000000..96a5fcb
--- /dev/null
+++ b/programs/winhelp/Makefile.in
@@ -0,0 +1,63 @@
+TOPSRC   = @top_srcdir@
+MODULE   = none
+PROGRAMS = winhelp hlp2sgml
+ALL_LIBS = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
+
+LANGUAGES   = En De
+
+# Installation infos
+
+INSTALL         = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA    = @INSTALL_DATA@
+prefix          = @prefix@
+exec_prefix     = @exec_prefix@
+bindir          = @bindir@
+libdir          = @libdir@
+sysconfdir      = @sysconfdir@
+mandir          = @mandir@/man1
+manext          = .1
+
+MOSTOBJS = \
+	winhelp.o \
+	hlpfile.o \
+	macro.o \
+	y.tab.o \
+	lex.yy.o
+
+STRINGOBJS = \
+	string.o \
+	$(LANGUAGES:%=%.o)
+
+C_SRCS = $(MOSTOBJS:.o=.c) $(STRINGOBJS:.o=.c) hlp2sgml.c
+
+all: check_winerc $(PROGRAMS)
+
+@MAKE_RULES@
+
+# Some strings need addresses >= 0x10000
+winhelp: $(MOSTOBJS) $(STRINGOBJS) $(WINELIB)
+	$(CC) -o winhelp $(MOSTOBJS) $(LDOPTIONS) $(ALL_LIBS) $(STRINGOBJS)
+
+hlp2sgml: hlp2sgml.o hlpfile.o
+	$(CC) -o hlp2sgml hlp2sgml.o hlpfile.o
+
+install: dummy
+	$(INSTALL_PROGRAM) winhelp $(bindir)/winhelp
+	$(INSTALL_PROGRAM) hlp2sgml $(bindir)/hlp2sgml
+
+clean::
+	$(RM) $(PROGRAMS) lex.yy.c y.tab.c y.tab.h
+	$(RM) $(LANGUAGES:%=%.c) $(LANGUAGES:%=%.h)
+
+y.tab.c y.tab.h: macro.yacc.y
+	$(YACC) -d -t macro.yacc.y
+
+lex.yy.c: macro.lex.l
+	$(LEX) -8 -I macro.lex.l
+
+$(LANGUAGES:%=%.c) $(LANGUAGES:%=%.h): $(WINERC) Xx.rc
+
+dummy:
+
+### Dependencies:
diff --git a/programs/winhelp/Xx.rc b/programs/winhelp/Xx.rc
new file mode 100644
index 0000000..d2e713b
--- /dev/null
+++ b/programs/winhelp/Xx.rc
@@ -0,0 +1,80 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#include "winhelp.h"
+
+#define CONCAT(a, b) CONCAT1(a, b)
+#define CONCAT1(a, b) a##b
+
+/* Menu */
+
+CONCAT(MENU_, LANGUAGE_ID) MENU
+{
+ POPUP MENU_FILE {
+   MENUITEM MENU_FILE_OPEN,             WH_OPEN
+   MENUITEM SEPARATOR   
+   MENUITEM MENU_FILE_PRINT,            WH_PRINT
+   MENUITEM MENU_FILE_PRINTER_SETUP,    WH_PRINTER_SETUP
+   MENUITEM SEPARATOR   
+   MENUITEM MENU_FILE_EXIT,             WH_EXIT
+ }
+ POPUP MENU_EDIT {
+   MENUITEM MENU_EDIT_COPY_DIALOG,      WH_COPY_DIALOG
+   MENUITEM SEPARATOR   
+   MENUITEM MENU_EDIT_ANNOTATE,         WH_ANNOTATE
+ }
+ POPUP MENU_BOOKMARK {
+   MENUITEM MENU_BOOKMARK_DEFINE,       WH_BOOKMARK_DEFINE
+ }
+ POPUP MENU_HELP {
+   MENUITEM MENU_HELP_ON_HELP,          WH_HELP_ON_HELP
+   MENUITEM MENU_HELP_ON_TOP,           WH_HELP_ON_TOP
+   MENUITEM SEPARATOR   
+   MENUITEM MENU_HELP_INFO,             WH_ABOUT
+#ifdef WINELIB
+   MENUITEM MENU_HELP_ABOUT_WINE,       WH_ABOUT_WINE
+#endif
+ }
+}
+
+/* Dialogs */
+
+DIALOG_TEST DIALOG 0, 0, 150, 22
+STYLE DS_MODALFRAME
+CAPTION "Macro Test"
+{
+GROUPBOX      "",   IDIGNORE,   4, 4, 102, 12
+EDITTEXT            99,         5, 7, 100,  8
+DEFPUSHBUTTON "OK", IDOK,     110, 5, 35,  12
+}
+
+/* Strings */
+
+#define ADDSTRING(str) ADDSTRING1(LANGUAGE_NUMBER, IDS_ ## str) STRING_ ## str
+#define ADDSTRING1(langnum, ids) ADDSTRING2(langnum, ids)
+#define ADDSTRING2(langnum, ids) 0x ## langnum ## ids
+
+#define STRINGIFY(str) STRINGIFY1(str)
+#define STRINGIFY1(str) #str
+
+#define STRING_LANGUAGE_ID        STRINGIFY(LANGUAGE_ID)
+
+STRINGTABLE
+{
+ADDSTRING(LANGUAGE_ID)
+ADDSTRING(WINE_HELP)
+ADDSTRING(ERROR)
+ADDSTRING(WARNING)
+ADDSTRING(INFO)
+ADDSTRING(NOT_IMPLEMENTED)
+ADDSTRING(HLPFILE_ERROR_s)
+ADDSTRING(CONTENTS)
+ADDSTRING(SEARCH)
+ADDSTRING(BACK)
+ADDSTRING(HISTORY)
+ADDSTRING(ALL_FILES)
+ADDSTRING(HELP_FILES_HLP)
+}
diff --git a/programs/winhelp/hlp2sgml.c b/programs/winhelp/hlp2sgml.c
new file mode 100644
index 0000000..7df0184
--- /dev/null
+++ b/programs/winhelp/hlp2sgml.c
@@ -0,0 +1,333 @@
+/*
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include "windows.h"
+#include "hlpfile.h"
+
+typedef struct
+{
+  const char *header1;
+  const char *header2;
+  const char *section;
+  const char *first_paragraph;
+  const char *newline;
+  const char *next_paragraph;
+  const char *special_char;
+  const char *begin_italic;
+  const char *end_italic;
+  const char *begin_boldface;
+  const char *end_boldface;
+  const char *begin_typewriter;
+  const char *end_typewriter;
+  const char *tail;
+} FORMAT;
+
+typedef struct
+{
+  const char ch;
+  const char *subst;
+} CHARMAP[];
+
+
+FORMAT format =
+{
+  "<!doctype linuxdoc system>\n"
+  "<article>\n"
+  "<title>\n",
+
+  "\n<author>\n%s\n"
+  "<date>\n%s\n",
+
+  "\n<sect>\n",
+  "\n<p>\n",
+  "\n<newline>\n",
+  "\n\n",
+
+  "&%s;",
+
+  "<em>",
+  "</em>",
+  "<bf>",
+  "</bf>",
+  "<tt>",
+  "</tt>",
+
+  "\n</article>\n"
+};
+
+CHARMAP charmap =
+  {{'Æ', "AElig"},
+   {'Á', "Aacute"},
+   {'Â', "Acirc"},
+   {'À', "Agrave"},
+   {'Ã', "Atilde"},
+   {'Ç', "Ccedil"},
+   {'É', "Eacute"},
+   {'È', "Egrave"},
+   {'Ë', "Euml"},
+   {'Í', "Iacute"},
+   {'Î', "Icirc"},
+   {'Ì', "Igrave"},
+   {'Ï', "Iuml"},
+   {'Ñ', "Ntilde"},
+   {'Ó', "Oacute"},
+   {'Ô', "Ocirc"},
+   {'Ò', "Ograve"},
+   {'Ø', "Oslash"},
+   {'Ú', "Uacute"},
+   {'Ù', "Ugrave"},
+   {'Ý', "Yacute"},
+   {'á', "aacute"},
+   {'â', "acirc"},
+   {'æ', "aelig"},
+   {'à', "agrave"},
+   {'å', "aring"},
+   {'ã', "atilde"},
+   {'ç', "ccedil"},
+   {'é', "eacute"},
+   {'ê', "ecirc"},
+   {'è', "egrave"},
+   {'ë', "euml"},
+   {'í', "iacute"},
+   {'î', "icirc"},
+   {'ì', "igrave"},
+   {'ï', "iuml"},
+   {'ñ', "ntilde"},
+   {'ó', "oacute"},
+   {'ÿ', "yuml"},
+   {'ô', "ocirc"},
+   {'ò', "ograve"},
+   {'ø', "oslash"},
+   {'õ', "otilde"},
+   {'ú', "uacute"},
+   {'û', "ucirc"},
+   {'ù', "ugrave"},
+   {'ý', "yacute"},
+   {'<', "lt"},
+   {'&', "amp"},
+   {'"', "dquot"},
+   {'#', "num"},
+   {'%', "percnt"},
+   {'\'', "quot"},
+#if 0
+   {'(', "lpar"},
+   {')', "rpar"},
+   {'*', "ast"},
+   {'+', "plus"},
+   {',', "comma"},
+   {'-', "hyphen"},
+   {':', "colon"},
+   {';', "semi"},
+   {'=', "equals"},
+   {'@', "commat"},
+   {'[', "lsqb"},
+   {']', "rsqb"},
+   {'^', "circ"},
+   {'_', "lowbar"},
+   {'{', "lcub"},
+   {'|', "verbar"},
+   {'}', "rcub"},
+   {'~', "tilde"},
+#endif
+   {'\\', "bsol"},
+   {'$', "dollar"},
+   {'Ä', "Auml"},
+   {'ä', "auml"},
+   {'Ö', "Ouml"},
+   {'ö', "ouml"},
+   {'Ü', "Uuml"},
+   {'ü', "uuml"},
+   {'ß', "szlig"},
+   {'>', "gt"},
+   {'§', "sect"},
+   {'¶', "para"},
+   {'©', "copy"},
+   {'¡', "iexcl"},
+   {'¿', "iquest"},
+   {'¢', "cent"},
+   {'£', "pound"},
+   {'×', "times"},
+   {'±', "plusmn"},
+   {'÷', "divide"},
+   {'¬', "not"},
+   {'µ', "mu"},
+   {0,0}};
+
+/***********************************************************************
+ *
+ *           print_text
+ */
+
+static void print_text(const char *p)
+{
+  int i;
+
+  for (; *p; p++)
+    {
+      for (i = 0; charmap[i].ch; i++)
+	if (*p == charmap[i].ch)
+	  {
+	    printf(format.special_char, charmap[i].subst);
+	    break;
+	  }
+      if (!charmap[i].ch)
+	printf("%c", *p);
+    }
+}
+
+/***********************************************************************
+ *
+ *           main
+ */
+
+int main(int argc, char **argv)
+{
+  HLPFILE   *hlpfile;
+  HLPFILE_PAGE *page;
+  HLPFILE_PARAGRAPH *paragraph;
+  time_t t;
+  char date[50];
+  char *filename;
+
+  hlpfile = HLPFILE_ReadHlpFile(argc > 1 ? argv[1] : "");
+
+  if (!hlpfile) return(2);
+
+  time(&t);
+  strftime(date, sizeof(date), "%x", localtime(&t));
+  filename = strrchr(hlpfile->lpszPath, '/');
+  if (filename) filename++;
+  else filename = hlpfile->lpszPath;
+
+  /* Header */
+  printf(format.header1);
+  print_text(hlpfile->lpszTitle);
+  printf(format.header2, filename, date);
+
+  for (page = hlpfile->first_page; page; page = page->next)
+    {
+      paragraph = page->first_paragraph;
+      if (!paragraph) continue;
+
+      /* Section */
+      printf(format.section);
+      for (; paragraph && !paragraph->wVSpace; paragraph = paragraph->next)
+	print_text(paragraph->lpszText);
+      printf(format.first_paragraph);
+
+      for (; paragraph; paragraph = paragraph->next)
+	{
+	  /* New line; new paragraph */
+	  if (paragraph->wVSpace == 1)
+	    printf(format.newline);
+	  else if (paragraph->wVSpace > 1)
+	    printf(format.next_paragraph);
+
+	  if (paragraph->wFont)
+	    printf(format.begin_boldface);
+
+	  print_text(paragraph->lpszText);
+
+	  if (paragraph->wFont)
+	    printf(format.end_boldface);
+	}
+    }
+
+  printf(format.tail);
+
+  return(0);
+}
+
+/***********************************************************************
+ *
+ *           Substitutions for some WINELIB functions
+ */
+
+HFILE OpenFile( LPCSTR path, OFSTRUCT *ofs, UINT mode )
+{
+  FILE *file;
+
+  if (!*path) return (HFILE) stdin;
+
+  file = fopen(path, "r");
+  if (!file) return HFILE_ERROR;
+  return (HFILE) file;
+}
+
+HFILE _lclose( HFILE hFile )
+{
+  fclose((FILE*) hFile);
+  return 0;
+}
+
+LONG _hread( HFILE hFile, SEGPTR buffer, LONG count )
+{
+  return fread(buffer, 1, count, (FILE*) hFile);
+}
+
+HGLOBAL GlobalAlloc( WORD flags, DWORD size )
+{
+  return (HGLOBAL) malloc(size);
+}
+
+LPVOID GlobalLock( HGLOBAL handle )
+{
+  return (LPVOID) handle;
+}
+
+HGLOBAL GlobalFree( HGLOBAL handle )
+{
+  free((VOID*) handle);
+  return(0);
+}
+
+/*
+ * String functions
+ *
+ * Copyright 1993 Yngvi Sigurjonsson (yngvi@hafro.is)
+ */
+
+INT lstrcmp(LPCSTR str1,LPCSTR str2)
+{
+  return strcmp( str1, str2 );
+}
+
+INT lstrcmpi( LPCSTR str1, LPCSTR str2 )
+{
+  INT res;
+
+  while (*str1)
+    {
+      if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
+      str1++;
+      str2++;
+    }
+  return toupper(*str1) - toupper(*str2);
+}
+
+INT lstrlen(LPCSTR str)
+{
+  return strlen(str);
+}
+
+SEGPTR lstrcpy( SEGPTR target, SEGPTR source )
+{
+  strcpy( (char *)target, (char *)source );
+  return target;
+}
+
+void hmemcpy(LPVOID hpvDest, LPCVOID hpvSource, LONG cbCopy)
+{
+  memcpy(hpvDest, hpvSource, cbCopy);
+}
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
new file mode 100644
index 0000000..80232d9
--- /dev/null
+++ b/programs/winhelp/hlpfile.c
@@ -0,0 +1,989 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#include <stdio.h>
+#include <windows.h>
+#include "winhelp.h"
+
+static void Report(LPCSTR str)
+{
+#if 0
+  fprintf(stderr, "%s\n", str);
+#endif
+}
+
+#define GET_USHORT(buffer, i)\
+(((BYTE)((buffer)[(i)]) + 0x100 * (BYTE)((buffer)[(i)+1])))
+#define GET_SHORT(buffer, i)\
+(((BYTE)((buffer)[(i)]) + 0x100 * (signed char)((buffer)[(i)+1])))
+#define GET_UINT(buffer, i)\
+GET_USHORT(buffer, i) + 0x10000 * GET_USHORT(buffer, i+2)
+
+static BOOL HLPFILE_DoReadHlpFile(HLPFILE*, LPCSTR);
+static BOOL HLPFILE_ReadFileToBuffer(HFILE);
+static BOOL HLPFILE_FindSubFile(LPCSTR name, BYTE**, BYTE**);
+static VOID HLPFILE_SystemCommands(HLPFILE*);
+static BOOL HLPFILE_Uncompress1_Phrases();
+static BOOL HLPFILE_Uncompress1_Topic();
+static BOOL HLPFILE_GetContext(HLPFILE*);
+static BOOL HLPFILE_AddPage(HLPFILE*, BYTE*, BYTE*);
+static BOOL HLPFILE_AddParagraph(HLPFILE*, BYTE *, BYTE*);
+static UINT HLPFILE_Uncompressed2_Size(BYTE*, BYTE*);
+static VOID HLPFILE_Uncompress2(BYTE**, BYTE*, BYTE*);
+
+static HLPFILE *first_hlpfile = 0;
+static HGLOBAL  hFileBuffer;
+static BYTE    *file_buffer;
+
+static struct
+{
+  UINT    num;
+  BYTE   *buf;
+  HGLOBAL hBuffer;
+} phrases;
+
+static struct
+{
+  BYTE    **map;
+  BYTE    *end;
+  UINT    wMapLen;
+  HGLOBAL hMap;
+  HGLOBAL hBuffer;
+} topic;
+
+static struct
+{
+  UINT  bDebug;
+  UINT  wFont;
+  UINT  wIndent;
+  UINT  wHSpace;
+  UINT  wVSpace;
+  UINT  wVBackSpace;
+  HLPFILE_LINK link;
+} attributes;
+
+/***********************************************************************
+ *
+ *           HLPFILE_Contents
+ */
+
+HLPFILE_PAGE *HLPFILE_Contents(LPCSTR lpszPath)
+{
+  HLPFILE *hlpfile = HLPFILE_ReadHlpFile(lpszPath);
+
+  if (!hlpfile) return(0);
+
+  return(hlpfile->first_page);
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_PageByNumber
+ */
+
+HLPFILE_PAGE *HLPFILE_PageByNumber(LPCSTR lpszPath, UINT wNum)
+{
+  HLPFILE_PAGE *page;
+  HLPFILE *hlpfile = HLPFILE_ReadHlpFile(lpszPath);
+
+  if (!hlpfile) return(0);
+
+  for (page = hlpfile->first_page; page && wNum; page = page->next) wNum--;
+
+  return page;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_HlpFilePageByHash
+ */
+
+HLPFILE_PAGE *HLPFILE_PageByHash(LPCSTR lpszPath, LONG lHash)
+{
+  INT i;
+  UINT wNum;
+  HLPFILE_PAGE *page;
+  HLPFILE *hlpfile = HLPFILE_ReadHlpFile(lpszPath);
+
+  if (!hlpfile) return(0);
+
+  for (i = 0; i < hlpfile->wContextLen; i++)
+    if (hlpfile->Context[i].lHash == lHash) break;
+
+  if (i >= hlpfile->wContextLen)
+    {
+      HLPFILE_FreeHlpFile(hlpfile);
+      return(0);
+    }
+
+  wNum = hlpfile->Context[i].wPage;
+  for (page = hlpfile->first_page; page && wNum; page = page->next) wNum--;
+
+  return page;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_Hash
+ */
+
+LONG HLPFILE_Hash(LPCSTR lpszContext)
+{
+  LONG lHash = 0;
+  CHAR c;
+  while((c = *lpszContext++))
+    {
+      CHAR x = 0;
+      if (c >= 'A' && c <= 'Z') x = c - 'A' + 17;
+      if (c >= 'a' && c <= 'z') x = c - 'a' + 17;
+      if (c >= '1' && c <= '9') x = c - '0';
+      if (c == '0') x = 10;
+      if (c == '.') x = 12;
+      if (c == '_') x = 13;
+      if (x) lHash = lHash * 43 + x;
+    }
+  return lHash;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_ReadHlpFile
+ */
+
+HLPFILE *HLPFILE_ReadHlpFile(LPCSTR lpszPath)
+{
+  HGLOBAL   hHlpFile;
+  HLPFILE *hlpfile;
+
+  for (hlpfile = first_hlpfile; hlpfile; hlpfile = hlpfile->next)
+    if (!lstrcmp(hlpfile->lpszPath, lpszPath))
+      {
+	hlpfile->wRefCount++;
+	return(hlpfile);
+      }
+
+  hHlpFile = GlobalAlloc(GMEM_FIXED, sizeof(HLPFILE) + lstrlen(lpszPath) + 1);
+  if (!hHlpFile) return(0);
+
+  hlpfile              = GlobalLock(hHlpFile);
+  hlpfile->hSelf       = hHlpFile;
+  hlpfile->wRefCount   = 1;
+  hlpfile->hTitle      = 0;
+  hlpfile->hContext    = 0;
+  hlpfile->wContextLen = 0;
+  hlpfile->first_page  = 0;
+  hlpfile->first_macro = 0;
+  hlpfile->prev        = 0;
+  hlpfile->next        = first_hlpfile;
+  first_hlpfile   = hlpfile;
+  if (hlpfile->next) hlpfile->next->prev = hlpfile;
+
+  hlpfile->lpszPath   = GlobalLock(hHlpFile);
+  hlpfile->lpszPath  += sizeof(HLPFILE);
+  lstrcpy(hlpfile->lpszPath, (SEGPTR) lpszPath);
+
+  phrases.hBuffer = topic.hBuffer = hFileBuffer = 0;
+
+  if (!HLPFILE_DoReadHlpFile(hlpfile, lpszPath))
+    {
+      HLPFILE_FreeHlpFile(hlpfile);
+      hlpfile = 0;
+    }
+
+  if (phrases.hBuffer) GlobalFree(phrases.hBuffer);
+  if (topic.hBuffer)   GlobalFree(topic.hBuffer);
+  if (topic.hMap)      GlobalFree(topic.hMap);
+  if (hFileBuffer)     GlobalFree(hFileBuffer);
+
+  return(hlpfile);
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_DoReadHlpFile
+ */
+
+static BOOL HLPFILE_DoReadHlpFile(HLPFILE *hlpfile, LPCSTR lpszPath)
+{
+  BOOL     ret;
+  HFILE    hFile;
+  OFSTRUCT ofs;
+  BYTE     *buf;
+
+  hFile=OpenFile(lpszPath, &ofs, OF_READ | OF_SEARCH);
+  if (hFile == HFILE_ERROR) return FALSE;
+
+  ret = HLPFILE_ReadFileToBuffer(hFile);
+  _lclose(hFile);
+  if (!ret) return FALSE;
+
+  HLPFILE_SystemCommands(hlpfile);
+  if (!HLPFILE_Uncompress1_Phrases()) return FALSE;
+  if (!HLPFILE_Uncompress1_Topic()) return FALSE;
+
+  buf = topic.map[0] + 0xc;
+  while(buf + 0xc < topic.end)
+    {
+      BYTE *end = MIN(buf + GET_UINT(buf, 0), topic.end);
+      UINT next, index, offset;
+
+      switch (buf[0x14])
+	{
+	case 0x02:
+	  if (!HLPFILE_AddPage(hlpfile, buf, end)) return(FALSE);
+	  break;
+
+	case 0x20:
+	  if (!HLPFILE_AddParagraph(hlpfile, buf, end)) return(FALSE);
+	  break;
+
+	case 0x23:
+	  if (!HLPFILE_AddParagraph(hlpfile, buf, end)) return(FALSE);
+	  break;
+
+	default:
+	  fprintf(stderr, "buf[0x14] = %x\n", buf[0x14]);
+	}
+
+      next   = GET_UINT(buf, 0xc);
+      if (next == 0xffffffff) break;
+
+      index  = next >> 14;
+      offset = next & 0x3fff;
+      if (index > topic.wMapLen) {Report("maplen"); break;}
+      buf = topic.map[index] + offset;
+    }
+
+  return(HLPFILE_GetContext(hlpfile));
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_AddPage
+ */
+
+static BOOL HLPFILE_AddPage(HLPFILE *hlpfile, BYTE *buf, BYTE *end)
+{
+  HGLOBAL   hPage;
+  HLPFILE_PAGE *page, **pageptr;
+  BYTE      *title;
+  UINT      titlesize;
+
+  for (pageptr = &hlpfile->first_page; *pageptr; pageptr = &(*pageptr)->next)
+    /* Nothing */; 
+
+  if (buf + 0x31 > end) {Report("page1"); return(FALSE);};
+  title = buf + GET_UINT(buf, 0x10);
+  if (title > end) {Report("page2"); return(FALSE);};
+
+  titlesize = HLPFILE_Uncompressed2_Size(title, end);
+  hPage = GlobalAlloc(GMEM_FIXED, sizeof(HLPFILE_PAGE) + titlesize);
+  if (!hPage) return FALSE;
+  page = *pageptr = GlobalLock(hPage);
+  pageptr               = &page->next;
+  page->hSelf           = hPage;
+  page->file            = hlpfile;
+  page->next            = 0;
+  page->first_paragraph = 0;
+
+  page->lpszTitle = GlobalLock(hPage);
+  page->lpszTitle += sizeof(HLPFILE_PAGE);
+  HLPFILE_Uncompress2(&title, end, page->lpszTitle);
+
+  page->wNumber = GET_UINT(buf, 0x21);
+
+  attributes.bDebug        = 0;
+  attributes.wFont         = 0;
+  attributes.wVSpace       = 0;
+  attributes.wVBackSpace   = 0;
+  attributes.wHSpace       = 0;
+  attributes.wIndent       = 0;
+  attributes.link.lpszPath = 0;
+
+  return TRUE;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_AddParagraph
+ */
+
+static BOOL HLPFILE_AddParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end)
+{
+  HGLOBAL            hParagraph;
+  HLPFILE_PAGE      *page;
+  HLPFILE_PARAGRAPH *paragraph, **paragraphptr;
+  UINT               textsize;
+  BYTE              *format, *text;
+  BOOL               format_header = TRUE;
+  BOOL               format_end = FALSE;
+  UINT               mask, i;
+
+  if (!hlpfile->first_page) {Report("paragraph1"); return(FALSE);};
+
+  for (page = hlpfile->first_page; page->next; page = page->next) /* Nothing */;
+  for (paragraphptr = &page->first_paragraph; *paragraphptr;
+       paragraphptr = &(*paragraphptr)->next) /* Nothing */; 
+
+  if (buf + 0x19 > end) {Report("paragraph2"); return(FALSE);};
+
+  if (buf[0x14] == 0x02) return TRUE;
+
+  text   = buf + GET_UINT(buf, 0x10);
+
+  switch (buf[0x14])
+    {
+    case 0x20:
+      format = buf + 0x18;
+      while (*format) format++;
+      format += 4;
+      break;
+
+    case 0x23:
+      format = buf + 0x2b;
+      if (buf[0x17] & 1) format++;
+      break;
+
+    default:
+      Report("paragraph3");
+      return FALSE;
+    }
+
+  while (text < end)
+    {
+      if (format_header)
+	{
+	  format_header = FALSE;
+
+	  mask = GET_USHORT(format, 0);
+	  mask &= 0x3ff;
+	  format += 2;
+
+	  for (i = 0; i < 10; i++, mask = mask >> 1)
+	    {
+	      if (mask & 1)
+		{
+		  BOOL twoargs = FALSE;
+		  CHAR prefix0 = ' ';
+		  CHAR prefix1 = '*';
+
+		  if (i == 9 && !twoargs)
+		    {
+		      switch (*format++)
+			{
+			default:
+			  prefix0 = prefix1 = '?';
+			  break;
+
+			case 0x82:
+			  prefix0 = prefix1 = 'x';
+			  break;
+
+			case 0x84:
+			  prefix0 = prefix1 = 'X';
+			  twoargs = TRUE;
+			}
+		    }
+
+		  if (*format & 1)
+		    switch(*format)
+		      {
+		      default:
+			format += 2;
+			break;
+		      }
+		  else
+		    switch(*format)
+		      {
+
+		      default:
+			format++;
+			break;
+
+		      case 0x08:
+			format += 3;
+			break;
+		      }
+
+		  if (twoargs) format += (*format & 1) ? 2 : 1;
+		}
+	    }
+	}
+
+      for (; !format_header && text < end && format < end && !*text; text++)
+	{
+	  switch(*format)
+	    {
+	    case 0x80:
+	      attributes.wFont = GET_USHORT(format, 1);
+	      format += 3;
+	      break;
+
+	    case 0x81:
+	      attributes.wVSpace++;
+	      format += 1;
+	      break;
+
+	    case 0x82:
+	      attributes.wVSpace += 2 - attributes.wVBackSpace;
+	      attributes.wVBackSpace = 0;
+	      attributes.wIndent = 0;
+	      format += 1;
+	      break;
+
+	    case 0x83:
+	      attributes.wIndent++;
+	      format += 1;
+	      break;
+
+	    case 0x84:
+	      format += 3;
+	      break;
+
+	    case 0x86:
+	    case 0x87:
+	    case 0x88:
+	      format += 9;
+	      break;
+
+	    case 0x89:
+	      attributes.wVBackSpace++;
+	      format += 1;
+	      break;
+
+	    case 0xa9:
+	      format += 2;
+	      break;
+
+	    case 0xe2:
+	    case 0xe3:
+	      attributes.link.lpszPath = hlpfile->lpszPath;
+	      attributes.link.lHash    = GET_UINT(format, 1);
+	      attributes.link.bPopup   = !(*format & 1);
+	      format += 5;
+	      break;
+
+	    case 0xea:
+	      attributes.link.lpszPath = format + 8;
+	      attributes.link.lHash    = GET_UINT(format, 4);
+	      attributes.link.bPopup   = !(*format & 1);
+	      format += 3 + GET_USHORT(format, 1);
+	      break;
+
+	    case 0xff:
+	      if (buf[0x14] != 0x23 || GET_USHORT(format, 1) == 0xffff)
+		{
+		  if (format_end) Report("format_end");
+		  format_end = TRUE;
+		  break;
+		}
+	      else
+		{
+		  format_header = TRUE;
+		  format += 10;
+		  break;
+		}
+
+	    default:
+	      Report("format");
+	      format++;
+	    }
+	}
+
+      if (text > end || format > end) {Report("paragraph_end"); return(FALSE);};
+      if (text == end && !format_end) Report("text_end");
+
+      if (text == end) break;
+
+      textsize = HLPFILE_Uncompressed2_Size(text, end);
+      hParagraph = GlobalAlloc(GMEM_FIXED, sizeof(HLPFILE_PARAGRAPH) + textsize);
+      if (!hParagraph) return FALSE;
+      paragraph = *paragraphptr = GlobalLock(hParagraph);
+      paragraphptr = &paragraph->next;
+      paragraph->hSelf    = hParagraph;
+      paragraph->next     = 0;
+      paragraph->link     = 0;
+
+      paragraph->lpszText = GlobalLock(hParagraph);
+      paragraph->lpszText += sizeof(HLPFILE_PARAGRAPH);
+      HLPFILE_Uncompress2(&text, end, paragraph->lpszText);
+
+      paragraph->bDebug      = attributes.bDebug;
+      paragraph->wFont       = attributes.wFont;
+      paragraph->wVSpace     = attributes.wVSpace;
+      paragraph->wHSpace     = attributes.wHSpace;
+      paragraph->wIndent     = attributes.wIndent;
+      if (attributes.link.lpszPath)
+	{
+	  LPSTR ptr;
+	  HGLOBAL handle = GlobalAlloc(GMEM_FIXED, sizeof(HLPFILE_LINK) +
+					   strlen(attributes.link.lpszPath) + 1);
+	  if (!handle) return FALSE;
+	  paragraph->link = GlobalLock(handle);
+	  paragraph->link->hSelf = handle;
+
+	  ptr = GlobalLock(handle);
+	  ptr += sizeof(HLPFILE_LINK);
+	  lstrcpy(ptr, (LPSTR) attributes.link.lpszPath);
+
+	  paragraph->link->lpszPath = ptr;
+	  paragraph->link->lHash    = attributes.link.lHash;
+	  paragraph->link->bPopup   = attributes.link.bPopup;
+	}
+
+      attributes.bDebug        = 0;
+      attributes.wVSpace       = 0;
+      attributes.wHSpace       = 0;
+      attributes.link.lpszPath = 0;
+    }
+
+  return TRUE;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_ReadFileToBuffer
+ */
+
+static BOOL HLPFILE_ReadFileToBuffer(HFILE hFile)
+{
+  BYTE  header[16], dummy[1];
+  UINT  size;
+
+  if (_hread(hFile, header, 16) != 16) {Report("header"); return(FALSE);};
+
+  size = GET_UINT(header, 12);
+  hFileBuffer = GlobalAlloc(GMEM_FIXED, size + 1);
+  if (!hFileBuffer) return FALSE;
+  file_buffer = GlobalLock(hFileBuffer);
+
+  memcpy(file_buffer, header, 16);
+  if (_hread(hFile, file_buffer + 16, size - 16) != size - 16)
+    {Report("filesize1"); return(FALSE);};
+
+  if (_hread(hFile, dummy, 1) != 0) Report("filesize2"); 
+
+  file_buffer[size] = '0';
+
+  return TRUE;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_FindSubFile
+ */
+
+static BOOL HLPFILE_FindSubFile(LPCSTR name, BYTE **subbuf, BYTE **subend)
+{
+  BYTE *root = file_buffer + GET_UINT(file_buffer,  4);
+  BYTE *end  = file_buffer + GET_UINT(file_buffer, 12);
+  BYTE *ptr  = root + 0x37;
+
+  while (ptr < end && ptr[0] == 0x7c)
+    {
+      BYTE *fname = ptr + 1;
+      ptr += strlen(ptr) + 1;
+      if (!lstrcmpi(fname, name))
+	{
+	  *subbuf = file_buffer + GET_UINT(ptr, 0);
+	  *subend = *subbuf + GET_UINT(*subbuf, 0);
+	  if (file_buffer > *subbuf || *subbuf > *subend || *subend >= end)
+	    {
+	      Report("subfile");
+	      return FALSE;
+	    }
+	  return TRUE;
+	}
+      else ptr += 4;
+    }
+  return FALSE;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_SystemCommands
+ */
+static VOID HLPFILE_SystemCommands(HLPFILE* hlpfile)
+{
+  BYTE *buf, *ptr, *end;
+  HGLOBAL handle;
+  HLPFILE_MACRO *macro, **m;
+  LPSTR p;
+
+  hlpfile->lpszTitle = "";
+
+  if (!HLPFILE_FindSubFile("SYSTEM", &buf, &end)) return;
+
+  for (ptr = buf + 0x15; ptr + 4 <= end; ptr += GET_USHORT(ptr, 2) + 4)
+    {
+      switch (GET_USHORT(ptr, 0))
+	{
+	case 1:
+	  if (hlpfile->hTitle) {Report("title"); break;}
+	  hlpfile->hTitle = GlobalAlloc(GMEM_FIXED, strlen(ptr + 4) + 1);
+	  if (!hlpfile->hTitle) return;
+	  hlpfile->lpszTitle = GlobalLock(hlpfile->hTitle);
+	  lstrcpy(hlpfile->lpszTitle, ptr + 4);
+	  break;
+
+	case 2:
+	  if (GET_USHORT(ptr, 2) != 1 || ptr[4] != 0) Report("system2");
+	  break;
+
+	case 3:
+	  if (GET_USHORT(ptr, 2) != 4 || GET_UINT(ptr, 4) != 0) Report("system3");
+	  break;
+
+	case 4:
+	  handle = GlobalAlloc(GMEM_FIXED, sizeof(HLPFILE_MACRO) + lstrlen(ptr + 4) + 1);
+	  if (!handle) break;
+	  macro = GlobalLock(handle);
+	  macro->hSelf = handle;
+	  p  = GlobalLock(handle);
+	  p += sizeof(HLPFILE_MACRO);
+	  lstrcpy(p, (LPSTR) ptr + 4);
+	  macro->lpszMacro = p;
+	  macro->next = 0;
+	  for (m = &hlpfile->first_macro; *m; m = &(*m)->next);
+	  *m = macro;
+	  break;
+
+	default:
+	  Report("system");
+	}
+    }
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_Uncompressed1_Size
+ */
+
+static INT HLPFILE_Uncompressed1_Size(BYTE *ptr, BYTE *end)
+{
+  INT  i, newsize = 0;
+
+  while (ptr < end)
+    {
+      INT mask=*ptr++;
+      for (i = 0; i < 8 && ptr < end; i++, mask = mask >> 1)
+	{
+	  if (mask & 1)
+	    {
+	      INT code = GET_USHORT(ptr, 0);
+	      INT len  = 3 + (code >> 12);
+	      newsize += len;
+	      ptr     += 2;
+	    }
+	  else newsize++, ptr++;
+	}
+    }
+
+  return(newsize);
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_Uncompress1
+ */
+
+static BYTE *HLPFILE_Uncompress1(BYTE *ptr, BYTE *end, BYTE *newptr)
+{
+  INT i;
+
+  while (ptr < end)
+    {
+      INT mask=*ptr++;
+      for (i = 0; i < 8 && ptr < end; i++, mask = mask >> 1)
+	{
+	  if (mask & 1)
+	    {
+	      INT code   = GET_USHORT(ptr, 0);
+	      INT len    = 3 + (code >> 12);
+	      INT offset = code & 0xfff;
+	      hmemcpy(newptr, newptr - offset - 1, len);
+	      newptr += len;
+	      ptr    += 2;
+	    }
+	  else *newptr++ = *ptr++;
+	}
+    }
+
+  return(newptr);
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_Uncompress1_Phrases
+ */
+
+static BOOL HLPFILE_Uncompress1_Phrases()
+{
+  UINT i, num, newsize;
+  BYTE *buf, *end, *newbuf;
+
+  if (!HLPFILE_FindSubFile("Phrases", &buf, &end)) {Report("phrases0"); return FALSE;}
+
+  num = phrases.num = GET_USHORT(buf, 9);
+  if (buf + 2 * num + 0x13 >= end) {Report("uncompress1a"); return(FALSE);};
+
+  newsize  = 2 * num + 2;
+  newsize += HLPFILE_Uncompressed1_Size(buf + 0x13 + 2 * num, end);
+  phrases.hBuffer = GlobalAlloc(GMEM_FIXED, newsize);
+  if (!phrases.hBuffer) return FALSE;
+  newbuf = phrases.buf = GlobalLock(phrases.hBuffer);
+
+  hmemcpy(newbuf, buf + 0x11, 2 * num + 2);
+  HLPFILE_Uncompress1(buf + 0x13 + 2 * num, end, newbuf + 2 * num + 2);
+
+  for (i = 0; i < num; i++)
+    {
+      INT i0 = GET_USHORT(newbuf, 2 * i);
+      INT i1 = GET_USHORT(newbuf, 2 * i + 2);
+      if (i1 < i0 || i1 > newsize) {Report("uncompress1b"); return(FALSE);};
+    }
+  return TRUE;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_Uncompress1_Topic
+ */
+
+static BOOL HLPFILE_Uncompress1_Topic()
+{
+  BYTE *buf, *ptr, *end, *newptr;
+  INT  i, newsize = 0;
+
+  if (!HLPFILE_FindSubFile("TOPIC", &buf, &end)) {Report("topic0"); return FALSE;}
+
+  buf += 9;
+  topic.wMapLen = (end - buf - 1) / 0x1000 + 1;
+
+  for (i = 0; i < topic.wMapLen; i++)
+    {
+      ptr = buf + i * 0x1000;
+
+      /* I don't know why, it's necessary for printman.hlp */
+      if (ptr + 0x44 > end) ptr = end - 0x44;
+
+      newsize += HLPFILE_Uncompressed1_Size(ptr + 0xc, MIN(end, ptr + 0x1000));
+    }
+
+  topic.hMap    = GlobalAlloc(GMEM_FIXED, topic.wMapLen * sizeof(topic.map[0]));
+  topic.hBuffer = GlobalAlloc(GMEM_FIXED, newsize);
+  if (!topic.hMap || !topic.hBuffer) return FALSE;
+  topic.map = GlobalLock(topic.hMap);
+  newptr = GlobalLock(topic.hBuffer);
+  topic.end = newptr + newsize;
+
+  for (i = 0; i < topic.wMapLen; i++)
+    {
+      ptr = buf + i * 0x1000;
+      if (ptr + 0x44 > end) ptr = end - 0x44;
+
+      topic.map[i] = newptr - 0xc;
+      newptr = HLPFILE_Uncompress1(ptr + 0xc, MIN(end, ptr + 0x1000), newptr);
+    }
+
+  return TRUE;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_Uncompressed2_Size
+ */
+
+static UINT HLPFILE_Uncompressed2_Size(BYTE *ptr, BYTE *end)
+{
+  UINT wSize   = 0;
+
+  while (ptr < end && *ptr)
+    {
+      if (*ptr >= 0x20)
+	wSize++, ptr++;
+      else
+	{
+	  BYTE *phptr, *phend;
+	  UINT code  = 0x100 * ptr[0] + ptr[1];
+	  UINT index = (code - 0x100) / 2;
+	  BOOL space = code & 1;
+
+	  if (index < phrases.num)
+	    {
+	      phptr = phrases.buf + GET_USHORT(phrases.buf, 2 * index);
+	      phend = phrases.buf + GET_USHORT(phrases.buf, 2 * index + 2);
+
+	      if (phend < phptr) Report("uncompress2a");
+
+	      wSize += phend - phptr;
+	      if (space) wSize++;
+	    }
+	  else Report("uncompress2b");
+
+	  ptr += 2;
+	}
+    }
+
+  return(wSize + 1);
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_Uncompress2
+ */
+
+static VOID HLPFILE_Uncompress2(BYTE **pptr, BYTE *end, BYTE *newptr)
+{
+  BYTE *ptr    = *pptr;
+
+  while (ptr < end && *ptr)
+    {
+      if (*ptr >= 0x20)
+	*newptr++ = *ptr++;
+      else
+	{
+	  BYTE *phptr, *phend;
+	  UINT code  = 0x100 * ptr[0] + ptr[1];
+	  UINT index = (code - 0x100) / 2;
+	  BOOL space = code & 1;
+
+	  phptr = phrases.buf + GET_USHORT(phrases.buf, 2 * index);
+	  phend = phrases.buf + GET_USHORT(phrases.buf, 2 * index + 2);
+
+	  hmemcpy(newptr, phptr, phend - phptr);
+	  newptr += phend - phptr;
+	  if (space) *newptr++ = ' ';
+
+	  ptr += 2;
+	}
+    }
+  *newptr  = '\0';
+  *pptr    = ptr;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_GetContext
+ */
+
+static BOOL HLPFILE_GetContext(HLPFILE *hlpfile)
+{
+  UINT i, j, clen, tlen;
+  BYTE *cbuf, *cptr, *cend, *tbuf, *tptr, *tend;
+
+  if (!HLPFILE_FindSubFile("CONTEXT", &cbuf, &cend)) {Report("context0"); return FALSE;}
+  if (cbuf + 0x37 > cend) {Report("context1"); return(FALSE);};
+  clen = GET_UINT(cbuf, 0x2b);
+  if (cbuf + 0x37 + 8 * hlpfile->wContextLen > cend) {Report("context2"); return(FALSE);};
+
+  if (!HLPFILE_FindSubFile("TTLBTREE", &tbuf, &tend)) {Report("ttlb0"); return FALSE;}
+  if (tbuf + 0x37 > tend) {Report("ttlb1"); return(FALSE);};
+  tlen = GET_UINT(tbuf, 0x2b);
+
+  hlpfile->hContext = GlobalAlloc(GMEM_FIXED, clen * sizeof(HLPFILE_CONTEXT));
+  if (!hlpfile->hContext) return FALSE;
+  hlpfile->Context = GlobalLock(hlpfile->hContext);
+  hlpfile->wContextLen = clen;
+
+  cptr = cbuf + 0x37;
+  for (i = 0; i < clen; i++, cptr += 8)
+    {
+      tptr = tbuf + 0x37;
+      for (j = 0; j < tlen; j++, tptr += 5 + strlen(tptr + 4))
+	{
+	  if (tptr + 4 >= tend) {Report("ttlb2"); return(FALSE);};
+	  if (GET_UINT(tptr, 0) == GET_UINT(cptr, 4)) break;
+	}
+      if (j >= tlen)
+	{
+	  Report("ttlb3");
+	  j = 0;
+	}
+      hlpfile->Context[i].lHash = GET_UINT(cptr, 0);
+      hlpfile->Context[i].wPage = j;
+    }
+
+  return TRUE;
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_DeleteParagraph
+ */
+
+static VOID HLPFILE_DeleteParagraph(HLPFILE_PARAGRAPH* paragraph)
+{
+  if (!paragraph) return;
+
+  if (paragraph->link) GlobalFree(paragraph->link->hSelf);
+
+  HLPFILE_DeleteParagraph(paragraph->next);
+  GlobalFree(paragraph->hSelf);
+}
+
+/***********************************************************************
+ *
+ *           DeletePage
+ */
+
+static VOID HLPFILE_DeletePage(HLPFILE_PAGE* page)
+{
+  if (!page) return;
+
+  HLPFILE_DeletePage(page->next);
+  HLPFILE_DeleteParagraph(page->first_paragraph);
+  GlobalFree(page->hSelf);
+}
+
+/***********************************************************************
+ *
+ *           DeleteMacro
+ */
+
+static VOID HLPFILE_DeleteMacro(HLPFILE_MACRO* macro)
+{
+  if (!macro) return;
+
+  HLPFILE_DeleteMacro(macro->next);
+  GlobalFree(macro->hSelf);
+}
+
+/***********************************************************************
+ *
+ *           HLPFILE_FreeHlpFile
+ */
+
+VOID HLPFILE_FreeHlpFile(HLPFILE* hlpfile)
+{
+  if (!hlpfile) return;
+  if (--hlpfile->wRefCount) return;
+
+  if (hlpfile->next) hlpfile->next->prev = hlpfile->prev;
+  if (hlpfile->prev) hlpfile->prev->next = hlpfile->next;
+  else first_hlpfile = 0;
+
+  HLPFILE_DeletePage(hlpfile->first_page);
+  HLPFILE_DeleteMacro(hlpfile->first_macro);
+  GlobalFree(hlpfile->hContext);
+  GlobalFree(hlpfile->hTitle);
+  GlobalFree(hlpfile->hSelf);
+}
+
+/***********************************************************************
+ *
+ *           FreeHlpFilePage
+ */
+
+VOID HLPFILE_FreeHlpFilePage(HLPFILE_PAGE* page)
+{
+  if (!page) return;
+  HLPFILE_FreeHlpFile(page->file);
+}
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */
diff --git a/programs/winhelp/hlpfile.h b/programs/winhelp/hlpfile.h
new file mode 100644
index 0000000..fb525db
--- /dev/null
+++ b/programs/winhelp/hlpfile.h
@@ -0,0 +1,90 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+struct tagHelpFile;
+
+typedef struct
+{
+  LPCSTR  lpszPath;
+  LONG    lHash;
+  BOOL    bPopup;
+
+  HGLOBAL hSelf;
+} HLPFILE_LINK;
+
+typedef struct tagHlpFileParagraph
+{
+  LPSTR  lpszText;
+
+  UINT   bDebug;
+  UINT   wFont;
+  UINT   wIndent;
+  UINT   wHSpace;
+  UINT   wVSpace;
+
+  HLPFILE_LINK *link;
+
+  struct tagHlpFileParagraph *next;
+
+  HGLOBAL hSelf;
+} HLPFILE_PARAGRAPH;
+
+typedef struct tagHlpFilePage
+{
+  LPSTR          lpszTitle;
+  HLPFILE_PARAGRAPH *first_paragraph;
+
+  UINT wNumber;
+
+  struct tagHlpFilePage *next;
+  struct tagHlpFileFile *file;
+
+  HGLOBAL hSelf;
+} HLPFILE_PAGE;
+
+typedef struct
+{
+  LONG lHash;
+  UINT wPage;
+} HLPFILE_CONTEXT;
+
+typedef struct tagHlpFileMacro
+{
+  LPCSTR lpszMacro;
+
+  HGLOBAL hSelf;
+  struct tagHlpFileMacro *next;
+} HLPFILE_MACRO;
+
+typedef struct tagHlpFileFile
+{
+  LPSTR        lpszPath;
+  LPSTR        lpszTitle;
+  HLPFILE_PAGE    *first_page;
+  HLPFILE_MACRO   *first_macro;
+  UINT         wContextLen;
+  HLPFILE_CONTEXT *Context;
+
+  struct tagHlpFileFile *prev;
+  struct tagHlpFileFile *next;
+
+  UINT       wRefCount;
+
+  HGLOBAL    hTitle;
+  HGLOBAL    hContext;
+  HGLOBAL    hSelf;
+} HLPFILE;
+
+HLPFILE      *HLPFILE_ReadHlpFile(LPCSTR lpszPath);
+HLPFILE_PAGE *HLPFILE_Contents(LPCSTR lpszPath);
+HLPFILE_PAGE *HLPFILE_PageByHash(LPCSTR lpszPath, LONG wNum);
+LONG          HLPFILE_Hash(LPCSTR lpszContext);
+VOID          HLPFILE_FreeHlpFilePage(HLPFILE_PAGE*);
+VOID          HLPFILE_FreeHlpFile(HLPFILE*);
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */
diff --git a/programs/winhelp/macro.c b/programs/winhelp/macro.c
new file mode 100644
index 0000000..7355270
--- /dev/null
+++ b/programs/winhelp/macro.c
@@ -0,0 +1,555 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#include <stdio.h>
+#include <windows.h>
+#include <commdlg.h>
+#ifdef WINELIB
+#include <shell.h>
+#endif
+#include "winhelp.h"
+#include "macro.h"
+
+VOID MACRO_About(VOID)
+{
+  fprintf(stderr, "About()\n");
+}
+
+VOID MACRO_AddAccelerator(LONG u1, LONG u2, LPCSTR str)
+{
+  fprintf(stderr, "AddAccelerator(%lu, %lu, \"%s\")\n", u1, u2, str);
+}
+
+VOID MACRO_ALink(LPCSTR str1, LONG u, LPCSTR str2)
+{
+  fprintf(stderr, "ALink(\"%s\", %lu, \"%s\")\n", str1, u, str2);
+}
+
+VOID MACRO_Annotate(VOID)
+{
+  fprintf(stderr, "Annotate()\n");
+}
+
+VOID MACRO_AppendItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4)
+{
+  fprintf(stderr, "AppendItem(\"%s\", \"%s\", \"%s\", \"%s\")\n", str1, str2, str3, str4);
+}
+
+VOID MACRO_Back(VOID)
+{
+  fprintf(stderr, "Back()\n");
+}
+
+VOID MACRO_BackFlush(VOID)
+{
+  fprintf(stderr, "BackFlush()\n");
+}
+
+VOID MACRO_BookmarkDefine(VOID)
+{
+  fprintf(stderr, "BookmarkDefine()\n");
+}
+
+VOID MACRO_BookmarkMore(VOID)
+{
+  fprintf(stderr, "BookmarkMore()\n");
+}
+
+VOID MACRO_BrowseButtons(VOID)
+{
+  MACRO_CreateButton("BTN_PREV", "&<<", "Prev()");
+  MACRO_CreateButton("BTN_NEXT", "&>>", "Next()");
+}
+
+VOID MACRO_ChangeButtonBinding(LPCSTR str1, LPCSTR str2)
+{
+  fprintf(stderr, "ChangeButtonBinding(\"%s\", \"%s\")\n", str1, str2);
+}
+
+VOID MACRO_ChangeEnable(LPCSTR str1, LPCSTR str2)
+{
+  fprintf(stderr, "ChangeEnable(\"%s\", \"%s\")\n", str1, str2);
+}
+
+VOID MACRO_ChangeItemBinding(LPCSTR str1, LPCSTR str2)
+{
+  fprintf(stderr, "ChangeItemBinding(\"%s\", \"%s\")\n", str1, str2);
+}
+
+VOID MACRO_CheckItem(LPCSTR str)
+{
+  fprintf(stderr, "CheckItem(\"%s\")\n", str);
+}
+
+VOID MACRO_CloseSecondarys(VOID)
+{
+  WINHELP_WINDOW *win;
+  for (win = Globals.win_list; win; win = win->next)
+    if (win->lpszName && lstrcmpi(win->lpszName, "main"))
+      DestroyWindow(win->hMainWnd);
+}
+
+VOID MACRO_CloseWindow(LPCSTR lpszWindow)
+{
+  WINHELP_WINDOW *win;
+  if (!lpszWindow || !lpszWindow[0]) lpszWindow = "main";
+
+  for (win = Globals.win_list; win; win = win->next)
+    if (win->lpszName && !lstrcmpi(win->lpszName, lpszWindow))
+      DestroyWindow(win->hMainWnd);
+}
+
+VOID MACRO_Compare(LPCSTR str)
+{
+  fprintf(stderr, "Compare(\"%s\")\n", str);
+}
+
+VOID MACRO_Contents(VOID)
+{
+  if (Globals.active_win->page)
+    MACRO_JumpContents(Globals.active_win->page->file->lpszPath, NULL);
+}
+
+VOID MACRO_ControlPanel(LPCSTR str1, LPCSTR str2, LONG u)
+{
+  fprintf(stderr, "ControlPanel(\"%s\", \"%s\", %lu)\n", str1, str2, u);
+}
+
+VOID MACRO_CopyDialog(VOID)
+{
+  fprintf(stderr, "CopyDialog()\n");
+}
+
+VOID MACRO_CopyTopic(VOID)
+{
+  fprintf(stderr, "CopyTopic()\n");
+}
+
+VOID MACRO_CreateButton(LPCSTR id, LPCSTR name, LPCSTR macro)
+{
+  WINHELP_WINDOW *win = Globals.active_win;
+  WINHELP_BUTTON *button, **b;
+  LONG            size;
+  HGLOBAL         handle;
+  LPSTR           ptr;
+
+  size = sizeof(WINHELP_BUTTON) + lstrlen(id) + lstrlen(name) + lstrlen(macro) + 3;
+  handle = GlobalAlloc(GMEM_FIXED, size);
+  if (!handle) return;
+
+  button = GlobalLock(handle);
+  button->hSelf = handle;
+  button->next  = 0;
+  button->hWnd  = 0;
+
+  ptr = GlobalLock(handle);
+  ptr += sizeof(WINHELP_BUTTON);
+
+  lstrcpy(ptr, (LPSTR) id);
+  button->lpszID = ptr;
+  ptr += lstrlen(id) + 1;
+
+  lstrcpy(ptr, (LPSTR) name);
+  button->lpszName = ptr;
+  ptr += lstrlen(name) + 1;
+
+  lstrcpy(ptr, (LPSTR) macro);
+  button->lpszMacro = ptr;
+
+  button->wParam = WH_FIRST_BUTTON;
+  for (b = &win->first_button; *b; b = &(*b)->next)
+    button->wParam = MAX(button->wParam, (*b)->wParam + 1);
+  *b = button;
+
+  SendMessage(win->hMainWnd, WM_USER, 0, 0);
+}
+
+VOID MACRO_DeleteItem(LPCSTR str)
+{
+  fprintf(stderr, "DeleteItem(\"%s\")\n", str);
+}
+
+VOID MACRO_DeleteMark(LPCSTR str)
+{
+  fprintf(stderr, "DeleteMark(\"%s\")\n", str);
+}
+
+VOID MACRO_DestroyButton(LPCSTR str)
+{
+  fprintf(stderr, "DestroyButton(\"%s\")\n", str);
+}
+
+VOID MACRO_DisableButton(LPCSTR str)
+{
+  fprintf(stderr, "DisableButton(\"%s\")\n", str);
+}
+
+VOID MACRO_DisableItem(LPCSTR str)
+{
+  fprintf(stderr, "DisableItem(\"%s\")\n", str);
+}
+
+VOID MACRO_EnableButton(LPCSTR str)
+{
+  fprintf(stderr, "EnableButton(\"%s\")\n", str);
+}
+
+VOID MACRO_EnableItem(LPCSTR str)
+{
+  fprintf(stderr, "EnableItem(\"%s\")\n", str);
+}
+
+VOID MACRO_EndMPrint(VOID)
+{
+  fprintf(stderr, "EndMPrint()\n");
+}
+
+VOID MACRO_ExecFile(LPCSTR str1, LPCSTR str2, LONG u, LPCSTR str3)
+{
+  fprintf(stderr, "ExecFile(\"%s\", \"%s\", %lu, \"%s\")\n", str1, str2, u, str3);
+}
+
+VOID MACRO_ExecProgram(LPCSTR str, LONG u)
+{
+  fprintf(stderr, "ExecProgram(\"%s\", %lu)\n", str, u);
+}
+
+VOID MACRO_Exit(VOID)
+{
+  while(Globals.win_list)
+    DestroyWindow(Globals.win_list->hMainWnd);
+}
+
+VOID MACRO_ExtAbleItem(LPCSTR str, LONG u)
+{
+  fprintf(stderr, "ExtAbleItem(\"%s\", %lu)\n", str, u);
+}
+
+VOID MACRO_ExtInsertItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4, LONG u1, LONG u2)
+{
+  fprintf(stderr, "ExtInsertItem(\"%s\", \"%s\", \"%s\", \"%s\", %lu, %lu)\n", str1, str2, str3, str4, u1, u2);
+}
+
+VOID MACRO_ExtInsertMenu(LPCSTR str1, LPCSTR str2, LPCSTR str3, LONG u1, LONG u2)
+{
+  fprintf(stderr, "ExtInsertMenu(\"%s\", \"%s\", \"%s\", %lu, %lu)\n", str1, str2, str3, u1, u2);
+}
+
+BOOL MACRO_FileExist(LPCSTR str)
+{
+  fprintf(stderr, "FileExist(\"%s\")\n", str);
+  return TRUE;
+}
+
+VOID MACRO_FileOpen(VOID)
+{
+  OPENFILENAME openfilename;
+  CHAR szPath[MAX_PATHNAME_LEN];
+  CHAR szDir[MAX_PATHNAME_LEN];
+  CHAR szzFilter[2 * MAX_STRING_LEN + 100];
+  LPSTR p = szzFilter;
+
+  LoadString(Globals.hInstance, IDS_HELP_FILES_HLP, p, MAX_STRING_LEN);
+  p += strlen(p) + 1;
+  lstrcpy(p, "*.hlp");
+  p += strlen(p) + 1;
+  LoadString(Globals.hInstance, IDS_ALL_FILES, p, MAX_STRING_LEN);
+  p += strlen(p) + 1;
+  lstrcpy(p, "*.*");
+  p += strlen(p) + 1;
+  *p = '\0';
+
+  GetWindowsDirectory(szDir, sizeof(szDir));
+
+  openfilename.lStructSize       = 0;
+  openfilename.hwndOwner         = Globals.active_win->hMainWnd;
+  openfilename.hInstance         = Globals.hInstance;
+  openfilename.lpstrFilter       = szzFilter;
+  openfilename.lpstrCustomFilter = 0;
+  openfilename.nMaxCustFilter    = 0;
+  openfilename.nFilterIndex      = 0;
+  openfilename.lpstrFile         = szPath;
+  openfilename.nMaxFile          = sizeof(szPath);
+  openfilename.lpstrFileTitle    = 0;
+  openfilename.nMaxFileTitle     = 0;
+  openfilename.lpstrInitialDir   = szDir;
+  openfilename.lpstrTitle        = 0;
+  openfilename.Flags             = 0;
+  openfilename.nFileOffset       = 0;
+  openfilename.nFileExtension    = 0;
+  openfilename.lpstrDefExt       = 0;
+  openfilename.lCustData         = 0;
+  openfilename.lpfnHook          = 0;
+  openfilename.lpTemplateName    = 0;
+
+  if (GetOpenFileName(&openfilename))
+    WINHELP_CreateHelpWindow(szPath, 0, "main", FALSE, NULL, NULL, SW_SHOWNORMAL);
+}
+
+VOID MACRO_Find(VOID)
+{
+  fprintf(stderr, "Find()\n");
+}
+
+VOID MACRO_Finder(VOID)
+{
+  fprintf(stderr, "Finder()\n");
+}
+
+VOID MACRO_FloatingMenu(VOID)
+{
+  fprintf(stderr, "FloatingMenu()\n");
+}
+
+VOID MACRO_Flush(VOID)
+{
+  fprintf(stderr, "Flush()\n");
+}
+
+VOID MACRO_FocusWindow(LPCSTR str)
+{
+  fprintf(stderr, "FocusWindow(\"%s\")\n", str);
+}
+
+VOID MACRO_Generate(LPCSTR str, WPARAM w, LPARAM l)
+{
+  fprintf(stderr, "Generate(\"%s\", %x, %lx)\n", str, w, l);
+}
+
+VOID MACRO_GotoMark(LPCSTR str)
+{
+  fprintf(stderr, "GotoMark(\"%s\")\n", str);
+}
+
+VOID MACRO_HelpOn(VOID)
+{
+  MACRO_JumpContents((Globals.wVersion > 4) ? "winhelp32.hlp" : "winhelp.hlp", NULL);
+}
+
+VOID MACRO_HelpOnTop(VOID)
+{
+  fprintf(stderr, "HelpOnTop()\n");
+}
+
+VOID MACRO_History(VOID)
+{
+  fprintf(stderr, "History()\n");
+}
+
+BOOL MACRO_InitMPrint(VOID)
+{
+  fprintf(stderr, "InitMPrint()\n");
+  return FALSE;
+}
+
+VOID MACRO_InsertItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPCSTR str4, LONG u)
+{
+  fprintf(stderr, "InsertItem(\"%s\", \"%s\", \"%s\", \"%s\", %lu)\n", str1, str2, str3, str4, u);
+}
+
+VOID MACRO_InsertMenu(LPCSTR str1, LPCSTR str2, LONG u)
+{
+  fprintf(stderr, "InsertMenu(\"%s\", \"%s\", %lu)\n", str1, str2, u);
+}
+
+BOOL MACRO_IsBook(VOID)
+{
+  fprintf(stderr, "IsBook()\n");
+  return TRUE;
+}
+
+BOOL MACRO_IsMark(LPCSTR str)
+{
+  fprintf(stderr, "IsMark(\"%s\")\n", str);
+  return FALSE;
+}
+
+BOOL MACRO_IsNotMark(LPCSTR str)
+{
+  fprintf(stderr, "IsNotMark(\"%s\")\n", str);
+  return TRUE;
+}
+
+VOID MACRO_JumpContents(LPCSTR lpszPath, LPCSTR lpszWindow)
+{
+  WINHELP_CreateHelpWindow(lpszPath, 0, lpszWindow, FALSE, NULL, NULL, SW_NORMAL);
+}
+
+VOID MACRO_JumpContext(LPCSTR lpszPath, LPCSTR lpszWindow, LONG context)
+{
+  fprintf(stderr, "JumpContext(\"%s\", \"%s\", %lu)\n", lpszPath, lpszWindow, context);
+}
+
+VOID MACRO_JumpHash(LPCSTR lpszPath, LPCSTR lpszWindow, LONG lHash)
+{
+  WINHELP_CreateHelpWindow(lpszPath, lHash, lpszWindow, FALSE, NULL, NULL, SW_NORMAL);
+}
+
+VOID MACRO_JumpHelpOn(VOID)
+{
+  fprintf(stderr, "JumpHelpOn()\n");
+}
+
+VOID MACRO_JumpID(LPCSTR lpszPath, LPCSTR lpszWindow, LPCSTR topic_id)
+{
+  MACRO_JumpHash(lpszPath, lpszWindow, HLPFILE_Hash(topic_id));
+}
+
+VOID MACRO_JumpKeyword(LPCSTR lpszPath, LPCSTR lpszWindow, LPCSTR keyword)
+{
+  fprintf(stderr, "JumpKeyword(\"%s\", \"%s\", \"%s\")\n", lpszPath, lpszWindow, keyword);
+}
+
+VOID MACRO_KLink(LPCSTR str1, LONG u, LPCSTR str2, LPCSTR str3)
+{
+  fprintf(stderr, "KLink(\"%s\", %lu, \"%s\", \"%s\")\n", str1, u, str2, str3);
+}
+
+VOID MACRO_Menu(VOID)
+{
+  fprintf(stderr, "Menu()\n");
+}
+
+VOID MACRO_MPrintHash(LONG u)
+{
+  fprintf(stderr, "MPrintHash(%lu)\n", u);
+}
+
+VOID MACRO_MPrintID(LPCSTR str)
+{
+  fprintf(stderr, "MPrintID(\"%s\")\n", str);
+}
+
+VOID MACRO_Next(VOID)
+{
+  fprintf(stderr, "Next()\n");
+}
+
+VOID MACRO_NoShow(VOID)
+{
+  fprintf(stderr, "NoShow()\n");
+}
+
+VOID MACRO_PopupContext(LPCSTR str, LONG u)
+{
+  fprintf(stderr, "PopupContext(\"%s\", %lu)\n", str, u);
+}
+
+VOID MACRO_PopupHash(LPCSTR str, LONG u)
+{
+  fprintf(stderr, "PopupHash(\"%s\", %lu)\n", str, u);
+}
+
+VOID MACRO_PopupId(LPCSTR str1, LPCSTR str2)
+{
+  fprintf(stderr, "PopupId(\"%s\", \"%s\")\n", str1, str2);
+}
+
+VOID MACRO_PositionWindow(LONG i1, LONG i2, LONG u1, LONG u2, LONG u3, LPCSTR str)
+{
+  fprintf(stderr, "PositionWindow(%li, %li, %lu, %lu, %lu, \"%s\")\n", i1, i2, u1, u2, u3, str);
+}
+
+VOID MACRO_Prev(VOID)
+{
+  fprintf(stderr, "Prev()\n");
+}
+
+VOID MACRO_Print(VOID)
+{
+  fprintf(stderr, "Print()\n");
+}
+
+VOID MACRO_PrinterSetup(VOID)
+{
+  fprintf(stderr, "PrinterSetup()\n");
+}
+
+VOID MACRO_RegisterRoutine(LPCSTR str1, LPCSTR str2, LPCSTR str3)
+{
+  fprintf(stderr, "RegisterRoutine(\"%s\", \"%s\", \"%s\")\n", str1, str2, str3);
+}
+
+VOID MACRO_RemoveAccelerator(LONG u1, LONG u2)
+{
+  fprintf(stderr, "RemoveAccelerator(%lu, %lu)\n", u1, u2);
+}
+
+VOID MACRO_ResetMenu(VOID)
+{
+  fprintf(stderr, "ResetMenu()\n");
+}
+
+VOID MACRO_SaveMark(LPCSTR str)
+{
+  fprintf(stderr, "SaveMark(\"%s\")\n", str);
+}
+
+VOID MACRO_Search(VOID)
+{
+  fprintf(stderr, "Search()\n");
+}
+
+VOID MACRO_SetContents(LPCSTR str, LONG u)
+{
+  fprintf(stderr, "SetContents(\"%s\", %lu)\n", str, u);
+}
+
+VOID MACRO_SetHelpOnFile(LPCSTR str)
+{
+  fprintf(stderr, "SetHelpOnFile(\"%s\")\n", str);
+}
+
+VOID MACRO_SetPopupColor(LONG u1, LONG u2, LONG u3)
+{
+  fprintf(stderr, "SetPopupColor(%lu, %lu, %lu)\n", u1, u2, u3);
+}
+
+VOID MACRO_ShellExecute(LPCSTR str1, LPCSTR str2, LONG u1, LONG u2, LPCSTR str3, LPCSTR str4)
+{
+  fprintf(stderr, "ShellExecute(\"%s\", \"%s\", %lu, %lu, \"%s\", \"%s\")\n", str1, str2, u1, u2, str3, str4);
+}
+
+VOID MACRO_ShortCut(LPCSTR str1, LPCSTR str2, WPARAM w, LPARAM l, LPCSTR str)
+{
+  fprintf(stderr, "ShortCut(\"%s\", \"%s\", %x, %lx, \"%s\")\n", str1, str2, w, l, str);
+}
+
+VOID MACRO_TCard(LONG u)
+{
+  fprintf(stderr, "TCard(%lu)\n", u);
+}
+
+VOID MACRO_Test(LONG u)
+{
+  fprintf(stderr, "Test(%lu)\n", u);
+}
+
+BOOL MACRO_TestALink(LPCSTR str)
+{
+  fprintf(stderr, "TestALink(\"%s\")\n", str);
+  return FALSE;
+}
+
+BOOL MACRO_TestKLink(LPCSTR str)
+{
+  fprintf(stderr, "TestKLink(\"%s\")\n", str);
+  return FALSE;
+}
+
+VOID MACRO_UncheckItem(LPCSTR str)
+{
+  fprintf(stderr, "UncheckItem(\"%s\")\n", str);
+}
+
+VOID MACRO_UpdateWindow(LPCSTR str1, LPCSTR str2)
+{
+  fprintf(stderr, "UpdateWindow(\"%s\", \"%s\")\n", str1, str2);
+}
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */
diff --git a/programs/winhelp/macro.h b/programs/winhelp/macro.h
new file mode 100644
index 0000000..b09e8dd
--- /dev/null
+++ b/programs/winhelp/macro.h
@@ -0,0 +1,108 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#include <windows.h>
+
+VOID MACRO_ExecuteMacro(LPCSTR);
+
+INT  yyparse(VOID);
+INT  yylex(VOID);
+VOID yyerror(LPCSTR);
+extern CHAR MACRO_extra_separator;
+
+VOID MACRO_About(VOID);
+VOID MACRO_AddAccelerator(LONG, LONG, LPCSTR);
+VOID MACRO_ALink(LPCSTR, LONG, LPCSTR);
+VOID MACRO_Annotate(VOID);
+VOID MACRO_AppendItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR);
+VOID MACRO_Back(VOID);
+VOID MACRO_BackFlush(VOID);
+VOID MACRO_BookmarkDefine(VOID);
+VOID MACRO_BookmarkMore(VOID);
+VOID MACRO_BrowseButtons(VOID);
+VOID MACRO_ChangeButtonBinding(LPCSTR, LPCSTR);
+VOID MACRO_ChangeEnable(LPCSTR, LPCSTR);
+VOID MACRO_ChangeItemBinding(LPCSTR, LPCSTR);
+VOID MACRO_CheckItem(LPCSTR);
+VOID MACRO_CloseSecondarys(VOID);
+VOID MACRO_CloseWindow(LPCSTR);
+VOID MACRO_Compare(LPCSTR);
+VOID MACRO_Contents(VOID);
+VOID MACRO_ControlPanel(LPCSTR, LPCSTR, LONG);
+VOID MACRO_CopyDialog(VOID);
+VOID MACRO_CopyTopic(VOID);
+VOID MACRO_CreateButton(LPCSTR, LPCSTR, LPCSTR);
+VOID MACRO_DeleteItem(LPCSTR);
+VOID MACRO_DeleteMark(LPCSTR);
+VOID MACRO_DestroyButton(LPCSTR);
+VOID MACRO_DisableButton(LPCSTR);
+VOID MACRO_DisableItem(LPCSTR);
+VOID MACRO_EnableButton(LPCSTR);
+VOID MACRO_EnableItem(LPCSTR);
+VOID MACRO_EndMPrint(VOID);
+VOID MACRO_ExecFile(LPCSTR, LPCSTR, LONG, LPCSTR);
+VOID MACRO_ExecProgram(LPCSTR, LONG);
+VOID MACRO_Exit(VOID);
+VOID MACRO_ExtAbleItem(LPCSTR, LONG);
+VOID MACRO_ExtInsertItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR, LONG, LONG);
+VOID MACRO_ExtInsertMenu(LPCSTR, LPCSTR, LPCSTR, LONG, LONG);
+BOOL MACRO_FileExist(LPCSTR);
+VOID MACRO_FileOpen(VOID);
+VOID MACRO_Find(VOID);
+VOID MACRO_Finder(VOID);
+VOID MACRO_FloatingMenu(VOID);
+VOID MACRO_Flush(VOID);
+VOID MACRO_FocusWindow(LPCSTR);
+VOID MACRO_Generate(LPCSTR, WPARAM, LPARAM);
+VOID MACRO_GotoMark(LPCSTR);
+VOID MACRO_HelpOn(VOID);
+VOID MACRO_HelpOnTop(VOID);
+VOID MACRO_History(VOID);
+BOOL MACRO_InitMPrint(VOID);
+VOID MACRO_InsertItem(LPCSTR, LPCSTR, LPCSTR, LPCSTR, LONG);
+VOID MACRO_InsertMenu(LPCSTR, LPCSTR, LONG);
+BOOL MACRO_IsBook(VOID);
+BOOL MACRO_IsMark(LPCSTR);
+BOOL MACRO_IsNotMark(LPCSTR);
+VOID MACRO_JumpContents(LPCSTR, LPCSTR);
+VOID MACRO_JumpContext(LPCSTR, LPCSTR, LONG);
+VOID MACRO_JumpHash(LPCSTR, LPCSTR, LONG);
+VOID MACRO_JumpHelpOn(VOID);
+VOID MACRO_JumpID(LPCSTR, LPCSTR, LPCSTR);
+VOID MACRO_JumpKeyword(LPCSTR, LPCSTR, LPCSTR);
+VOID MACRO_KLink(LPCSTR, LONG, LPCSTR, LPCSTR);
+VOID MACRO_Menu(VOID);
+VOID MACRO_MPrintHash(LONG);
+VOID MACRO_MPrintID(LPCSTR);
+VOID MACRO_Next(VOID);
+VOID MACRO_NoShow(VOID);
+VOID MACRO_PopupContext(LPCSTR, LONG);
+VOID MACRO_PopupHash(LPCSTR, LONG);
+VOID MACRO_PopupId(LPCSTR, LPCSTR);
+VOID MACRO_PositionWindow(LONG, LONG, LONG, LONG, LONG, LPCSTR);
+VOID MACRO_Prev(VOID);
+VOID MACRO_Print(VOID);
+VOID MACRO_PrinterSetup(VOID);
+VOID MACRO_RegisterRoutine(LPCSTR, LPCSTR, LPCSTR);
+VOID MACRO_RemoveAccelerator(LONG, LONG);
+VOID MACRO_ResetMenu(VOID);
+VOID MACRO_SaveMark(LPCSTR);
+VOID MACRO_Search(VOID);
+VOID MACRO_SetContents(LPCSTR, LONG);
+VOID MACRO_SetHelpOnFile(LPCSTR);
+VOID MACRO_SetPopupColor(LONG, LONG, LONG);
+VOID MACRO_ShellExecute(LPCSTR, LPCSTR, LONG, LONG, LPCSTR, LPCSTR);
+VOID MACRO_ShortCut(LPCSTR, LPCSTR, WPARAM, LPARAM, LPCSTR);
+VOID MACRO_TCard(LONG);
+VOID MACRO_Test(LONG);
+BOOL MACRO_TestALink(LPCSTR);
+BOOL MACRO_TestKLink(LPCSTR);
+VOID MACRO_UncheckItem(LPCSTR);
+VOID MACRO_UpdateWindow(LPCSTR, LPCSTR);
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */
diff --git a/programs/winhelp/macro.lex.l b/programs/winhelp/macro.lex.l
new file mode 100644
index 0000000..146c8ea
--- /dev/null
+++ b/programs/winhelp/macro.lex.l
@@ -0,0 +1,235 @@
+%{
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+%}
+%x quote dquote
+%x null_string
+%{
+#include "macro.h"
+#include "y.tab.h"
+
+static LPCSTR  macroptr, firsttoken, thistoken, nexttoken, current_string;
+static LPSTR   strptr;
+static HGLOBAL hStringBuffer = 0;
+
+CHAR MACRO_extra_separator = 0;
+
+#define YY_INPUT(buf,result,max_size)\
+  if ((result = *macroptr ? 1 : 0)) buf[0] = *macroptr++;
+
+#define YY_USER_ACTION\
+  if (YY_START == INITIAL) thistoken = nexttoken, nexttoken = macroptr;
+
+#define YY_NO_UNPUT
+#define YY_NO_TOP_STATE
+%}
+%%
+About			yylval = MACRO_About;			return VOID_FUNCTION_VOID;
+AddAccelerator|AA	yylval = MACRO_AddAccelerator;		return VOID_FUNCTION_2UINT_STRING;
+ALink|AL		yylval = MACRO_ALink;			return VOID_FUNCTION_STRING_UINT_STRING;
+Annotate		yylval = MACRO_Annotate;		return VOID_FUNCTION_VOID;
+AppendItem		yylval = MACRO_AppendItem;		return VOID_FUNCTION_4STRING;
+Back			yylval = MACRO_Back;			return VOID_FUNCTION_VOID;
+BackFlush|BF		yylval = MACRO_BackFlush;		return VOID_FUNCTION_VOID;
+BookmarkDefine		yylval = MACRO_BookmarkDefine;		return VOID_FUNCTION_VOID;
+BookmarkMore		yylval = MACRO_BookmarkMore;		return VOID_FUNCTION_VOID;
+BrowseButtons		yylval = MACRO_BrowseButtons;		return VOID_FUNCTION_VOID;
+ChangeButtonBinding|CBB	yylval = MACRO_ChangeButtonBinding;	return VOID_FUNCTION_2STRING;
+ChangeEnable|CE		yylval = MACRO_ChangeEnable;		return VOID_FUNCTION_2STRING;
+ChangeItemBinding|CIB	yylval = MACRO_ChangeItemBinding;	return VOID_FUNCTION_2STRING;
+CheckItem|CI		yylval = MACRO_CheckItem;		return VOID_FUNCTION_STRING;
+CloseSecondarys|CS	yylval = MACRO_CloseSecondarys;		return VOID_FUNCTION_VOID;
+CloseWindow|CW		yylval = MACRO_CloseWindow;		return VOID_FUNCTION_STRING;
+Compare			yylval = MACRO_Compare;			return VOID_FUNCTION_STRING;
+Contents		yylval = MACRO_Contents;		return VOID_FUNCTION_VOID;
+ControlPanel		yylval = MACRO_ControlPanel;		return VOID_FUNCTION_2STRING_UINT;
+CopyDialog		yylval = MACRO_CopyDialog;		return VOID_FUNCTION_VOID;
+CopyTopic|CT		yylval = MACRO_CopyTopic;		return VOID_FUNCTION_VOID;
+CreateButton|CB		yylval = MACRO_CreateButton;		return VOID_FUNCTION_3STRING;
+DeleteItem		yylval = MACRO_DeleteItem;		return VOID_FUNCTION_STRING;
+DeleteMark		yylval = MACRO_DeleteMark;		return VOID_FUNCTION_STRING;
+DestroyButton		yylval = MACRO_DestroyButton;		return VOID_FUNCTION_STRING;
+DisableButton|DB	yylval = MACRO_DisableButton;		return VOID_FUNCTION_STRING;
+DisableItem|DI		yylval = MACRO_DisableItem;		return VOID_FUNCTION_STRING;
+EnableButton|EB		yylval = MACRO_EnableButton;		return VOID_FUNCTION_STRING;
+EnableItem|EI		yylval = MACRO_EnableItem;		return VOID_FUNCTION_STRING;
+EndMPrint		yylval = MACRO_EndMPrint;		return VOID_FUNCTION_VOID;
+ExecFile|EF		yylval = MACRO_ExecFile;		return VOID_FUNCTION_2STRING_UINT_STRING;
+ExecProgram|EP		yylval = MACRO_ExecProgram;		return VOID_FUNCTION_STRING_UINT;
+Exit			yylval = MACRO_Exit;			return VOID_FUNCTION_VOID;
+ExtAbleItem		yylval = MACRO_ExtAbleItem;		return VOID_FUNCTION_STRING_UINT;
+ExtInsertItem		yylval = MACRO_ExtInsertItem;		return VOID_FUNCTION_4STRING_2UINT;
+ExtInsertMenu		yylval = MACRO_ExtInsertMenu;		return VOID_FUNCTION_3STRING_2UINT;
+FileExist|FE		yylval = MACRO_FileExist;		return BOOL_FUNCTION_STRING;
+FileOpen|FO		yylval = MACRO_FileOpen;		return VOID_FUNCTION_VOID;
+Find			yylval = MACRO_Find;			return VOID_FUNCTION_VOID;
+Finder|FD		yylval = MACRO_Finder;			return VOID_FUNCTION_VOID;
+FloatingMenu		yylval = MACRO_FloatingMenu;		return VOID_FUNCTION_VOID;
+Flush|FH		yylval = MACRO_Flush;			return VOID_FUNCTION_VOID;
+FocusWindow		yylval = MACRO_FocusWindow;		return VOID_FUNCTION_STRING;
+Generate		yylval = MACRO_Generate;		return VOID_FUNCTION_STRING_WPARAM_LPARAM;
+GotoMark		yylval = MACRO_GotoMark;		return VOID_FUNCTION_STRING;
+HelpOn			yylval = MACRO_HelpOn;			return VOID_FUNCTION_VOID;
+HelpOnTop		yylval = MACRO_HelpOnTop;		return VOID_FUNCTION_VOID;
+History			yylval = MACRO_History;			return VOID_FUNCTION_VOID;
+IfThen|IF							return IF_THEN;
+IfThenElse|IE							return IF_THEN_ELSE;
+InitMPrint		yylval = MACRO_InitMPrint;		return BOOL_FUNCTION_VOID;
+InsertItem		yylval = MACRO_InsertItem;		return VOID_FUNCTION_4STRING_UINT;
+InsertMenu		yylval = MACRO_InsertMenu;		return VOID_FUNCTION_2STRING_UINT;
+IsBook			yylval = MACRO_IsBook;			return BOOL_FUNCTION_VOID;
+IsMark			yylval = MACRO_IsMark;			return BOOL_FUNCTION_STRING;
+IsNotMark|NM		yylval = MACRO_IsNotMark;		return BOOL_FUNCTION_STRING;
+JumpContents		yylval = MACRO_JumpContents;		return VOID_FUNCTION_FILE_WIN;
+JumpContext|JC		yylval = MACRO_JumpContext;		return VOID_FUNCTION_FILE_WIN_UINT;
+JumpHash|JH		yylval = MACRO_JumpHash;		return VOID_FUNCTION_FILE_WIN_UINT;
+JumpHelpOn		yylval = MACRO_JumpHelpOn;		return VOID_FUNCTION_VOID;
+JumpID|JI		yylval = MACRO_JumpID;			return VOID_FUNCTION_FILE_WIN_STRING;
+JumpKeyword|JK		yylval = MACRO_JumpKeyword;		return VOID_FUNCTION_FILE_WIN_STRING;
+KLink|KL		yylval = MACRO_KLink;			return VOID_FUNCTION_STRING_UINT_2STRING;
+Menu|MU			yylval = MACRO_Menu;			return VOID_FUNCTION_VOID;
+MPrintHash		yylval = MACRO_MPrintHash;		return VOID_FUNCTION_UINT;
+MPrintID		yylval = MACRO_MPrintID;		return VOID_FUNCTION_STRING;
+Next			yylval = MACRO_Next;			return VOID_FUNCTION_VOID;
+NoShow			yylval = MACRO_NoShow;			return VOID_FUNCTION_VOID;
+Not								return NOT;
+PopupContext|PC		yylval = MACRO_PopupContext;		return VOID_FUNCTION_STRING_UINT;
+PopupHash		yylval = MACRO_PopupHash;		return VOID_FUNCTION_STRING_UINT;
+PopupId|PI		yylval = MACRO_PopupId;			return VOID_FUNCTION_2STRING;
+PositionWindow|PW	yylval = MACRO_PositionWindow;		return VOID_FUNCTION_2INT_3UINT_STRING;
+Prev			yylval = MACRO_Prev;			return VOID_FUNCTION_VOID;
+Print			yylval = MACRO_Print;			return VOID_FUNCTION_VOID;
+PrinterSetup		yylval = MACRO_PrinterSetup;		return VOID_FUNCTION_VOID;
+RegisterRoutine|RR	yylval = MACRO_RegisterRoutine;		return VOID_FUNCTION_3STRING;
+RemoveAccelerator|RA	yylval = MACRO_RemoveAccelerator;	return VOID_FUNCTION_2UINT;
+ResetMenu		yylval = MACRO_ResetMenu;		return VOID_FUNCTION_VOID;
+SaveMark		yylval = MACRO_SaveMark;		return VOID_FUNCTION_STRING;
+Search			yylval = MACRO_Search;			return VOID_FUNCTION_VOID;
+SetContents		yylval = MACRO_SetContents;		return VOID_FUNCTION_STRING_UINT;
+SetHelpOnFile		yylval = MACRO_SetHelpOnFile;		return VOID_FUNCTION_STRING;
+SetPopupColor|SPC	yylval = MACRO_SetPopupColor;		return VOID_FUNCTION_3UINT;
+ShellExecute|SE		yylval = MACRO_ShellExecute;		return VOID_FUNCTION_2STRING_2UINT_2STRING;
+ShortCut|SH		yylval = MACRO_ShortCut;		return VOID_FUNCTION_2STRING_WPARAM_LPARAM_STRING;
+TCard			yylval = MACRO_TCard;			return VOID_FUNCTION_UINT;
+Test			yylval = MACRO_Test;			return VOID_FUNCTION_UINT;
+TestALink		yylval = MACRO_TestALink;		return BOOL_FUNCTION_STRING;
+TestKLink		yylval = MACRO_TestKLink;		return BOOL_FUNCTION_STRING;
+UncheckItem|UI		yylval = MACRO_UncheckItem;		return VOID_FUNCTION_STRING;
+UpdateWindow|UW		yylval = MACRO_UpdateWindow;		return VOID_FUNCTION_2STRING;
+
+[-+]?[0-9]+		yylval.integer = strtol(yytext, NULL, 10);	return INTEGER;
+[-+]?0[xX][0-9a-f]+	yylval.integer = strtol(yytext, NULL, 16);	return INTEGER;
+
+\`			|
+\"			{
+  			  if (!hStringBuffer)
+			    {
+			      hStringBuffer = GlobalAlloc(GMEM_FIXED, strlen(macroptr));
+			      strptr = GlobalLock(hStringBuffer);
+			    }
+			  current_string = strptr;
+			  yy_push_state(yytext[0] == '`' ? quote : dquote);
+			}
+
+<quote>\`		{
+			  *strptr++ = yytext[0];
+			  yy_push_state(quote);
+			}
+
+<quote>\'		|
+<dquote>\"		{
+			  yy_pop_state();
+			  if (YY_START == INITIAL)
+			    {
+			      *strptr++ = '\0';
+			      if (MACRO_extra_separator)
+				{
+				  yy_push_state(null_string);
+				  MACRO_extra_separator = 0;
+				}
+			      yylval = current_string;
+			      return STRING;
+			    }
+			  else *strptr++ = yytext[0];
+			}
+
+<quote,dquote>{
+
+.			{
+			  if (MACRO_extra_separator == (CHAR) yytext[0])
+			    {
+			      *strptr++ = '\0';
+			      MACRO_extra_separator = 0;
+			      yylval = current_string;
+			      current_string = strptr;
+			      return STRING;
+			    }
+			  else *strptr++ = yytext[0];
+			}
+
+\\.			*strptr++ = yytext[1];
+
+<<EOF>>			return 0;
+}
+
+<null_string>""		{
+			  yy_pop_state();
+			  yylval = (LPCSTR) 0;
+			  return STRING;
+			}
+
+" "
+
+.			return yytext[0];
+%%
+#include "winhelp.h"
+static CHAR szTestMacro[256];
+
+static LRESULT MACRO_TestDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+  if (msg == WM_COMMAND && wParam == IDOK)
+    {
+      GetDlgItemText(hDlg, 99, szTestMacro, sizeof(szTestMacro));
+      EndDialog(hDlg, IDCANCEL);
+      return TRUE;
+    }
+  return FALSE;
+}
+
+VOID MACRO_ExecuteMacro(LPCSTR macro)
+{
+  static BOOL init = TRUE;
+
+  if (init) init = FALSE;
+  else
+    {
+      YY_FLUSH_BUFFER;
+      while (YY_START != INITIAL)
+	yy_pop_state();
+    }
+
+  if (!lstrcmpi(macro, "MacroTest"))
+    {
+      WNDPROC lpfnDlg = MakeProcInstance(MACRO_TestDialogProc, Globals.hInstance);
+      DialogBox(Globals.hInstance, STRING_DIALOG_TEST, Globals.active_win->hMainWnd, lpfnDlg);
+      FreeProcInstance(lpfnDlg);
+      macro = szTestMacro;
+    }
+
+  macroptr = firsttoken = thistoken = nexttoken = macro;
+
+  yyparse();
+
+  if (hStringBuffer) GlobalFree(hStringBuffer);
+  hStringBuffer = 0;
+}
+
+void yyerror (const char *s)
+{
+  fprintf(stderr, "%s\n%.*s\n%*s%s\n", s,
+	  thistoken - firsttoken, firsttoken,
+	  thistoken - firsttoken, "", thistoken);
+}
diff --git a/programs/winhelp/macro.yacc.y b/programs/winhelp/macro.yacc.y
new file mode 100644
index 0000000..66bce6e
--- /dev/null
+++ b/programs/winhelp/macro.yacc.y
@@ -0,0 +1,170 @@
+%{
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#include "macro.h"
+static int skip = 0;
+%}
+%union
+  {
+    BOOL    bool;
+    LPCSTR  string;
+    LONG    integer;
+    VOID    (*void_function_void)(VOID);
+    BOOL    (*bool_function_void)(VOID);
+    VOID    (*void_function_string)(LPCSTR);
+    BOOL    (*bool_function_string)(LPCSTR);
+
+    BOOL    (*bool_funktion_string)(LPCSTR);
+    BOOL    (*bool_funktion_void)(VOID);
+    VOID    (*void_funktion_2int_3uint_string)(LONG,LONG,LONG,LONG,LONG,LPCSTR);
+    VOID    (*void_funktion_2string)(LPCSTR,LPCSTR);
+    VOID    (*void_funktion_2string_2uint_2string)(LPCSTR,LPCSTR,LONG,LONG,LPCSTR,LPCSTR);
+    VOID    (*void_funktion_2string_uint)(LPCSTR,LPCSTR,LONG);
+    VOID    (*void_funktion_2string_uint_string)(LPCSTR,LPCSTR,LONG,LPCSTR);
+    VOID    (*void_funktion_2string_wparam_lparam_string)(LPCSTR,LPCSTR,WPARAM,LPARAM,LPCSTR);
+    VOID    (*void_funktion_2uint)(LONG,LONG);
+    VOID    (*void_funktion_2uint_string)(LONG,LONG,LPCSTR);
+    VOID    (*void_funktion_3string)(LPCSTR,LPCSTR,LPCSTR);
+    VOID    (*void_funktion_3string_2uint)(LPCSTR,LPCSTR,LPCSTR,LONG,LONG);
+    VOID    (*void_funktion_3uint)(LONG,LONG,LONG);
+    VOID    (*void_funktion_4string)(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
+    VOID    (*void_funktion_4string_2uint)(LPCSTR,LPCSTR,LPCSTR,LPCSTR,LONG,LONG);
+    VOID    (*void_funktion_4string_uint)(LPCSTR,LPCSTR,LPCSTR,LPCSTR,LONG);
+    VOID    (*void_funktion_string)(LPCSTR);
+    VOID    (*void_funktion_string_uint)(LPCSTR,LONG);
+    VOID    (*void_funktion_string_uint_2string)(LPCSTR,LONG,LPCSTR,LPCSTR);
+    VOID    (*void_funktion_string_uint_string)(LPCSTR,LONG,LPCSTR);
+    VOID    (*void_funktion_string_wparam_lparam)(LPCSTR,WPARAM,LPARAM);
+    VOID    (*void_funktion_uint)(LONG);
+    VOID    (*void_funktion_void)(VOID);
+  }
+%token							NOT
+%token 							IF_THEN
+%token 							IF_THEN_ELSE
+%token <string>	 					STRING
+%token <integer> 					INTEGER
+%token <bool_funktion_string>				BOOL_FUNCTION_STRING
+%token <bool_funktion_void>				BOOL_FUNCTION_VOID
+%token <void_funktion_2int_3uint_string>		VOID_FUNCTION_2INT_3UINT_STRING
+%token <void_funktion_2string>				VOID_FUNCTION_2STRING
+%token <void_funktion_2string_2uint_2string>		VOID_FUNCTION_2STRING_2UINT_2STRING
+%token <void_funktion_2string_uint>			VOID_FUNCTION_2STRING_UINT
+%token <void_funktion_2string_uint_string>		VOID_FUNCTION_2STRING_UINT_STRING
+%token <void_funktion_2string_wparam_lparam_string>	VOID_FUNCTION_2STRING_WPARAM_LPARAM_STRING
+%token <void_funktion_2uint>				VOID_FUNCTION_2UINT
+%token <void_funktion_2uint_string>			VOID_FUNCTION_2UINT_STRING
+%token <void_funktion_3string>				VOID_FUNCTION_3STRING
+%token <void_funktion_3string_2uint>			VOID_FUNCTION_3STRING_2UINT
+%token <void_funktion_3uint>				VOID_FUNCTION_3UINT
+%token <void_funktion_4string>				VOID_FUNCTION_4STRING
+%token <void_funktion_4string_2uint>			VOID_FUNCTION_4STRING_2UINT
+%token <void_funktion_4string_uint>			VOID_FUNCTION_4STRING_UINT
+%token <void_funktion_string>				VOID_FUNCTION_STRING
+%token <void_funktion_string_uint>			VOID_FUNCTION_STRING_UINT
+%token <void_funktion_string_uint_2string>		VOID_FUNCTION_STRING_UINT_2STRING
+%token <void_funktion_string_uint_string>		VOID_FUNCTION_STRING_UINT_STRING
+%token <void_funktion_string_wparam_lparam>		VOID_FUNCTION_STRING_WPARAM_LPARAM
+%token <void_funktion_uint>				VOID_FUNCTION_UINT
+%token <void_funktion_void>				VOID_FUNCTION_VOID
+%token <void_funktion_2string>				VOID_FUNCTION_FILE_WIN
+%token <void_funktion_3string>				VOID_FUNCTION_FILE_WIN_STRING
+%token <void_funktion_2string_uint>			VOID_FUNCTION_FILE_WIN_UINT
+%type  <bool> bool_macro
+%type  <string> filename
+%%
+
+macrostring:	macro |
+		macro macrosep macrostring ;
+
+macrosep:	';' |
+		':' ;
+
+macro:		/* Empty */ |
+		IF_THEN      '(' bool_macro ','  {if (! $3) skip++;}
+                                 macrostring ')' {if (! $3) skip--;} |
+		IF_THEN_ELSE '(' bool_macro ','  {if (! $3) skip++;}
+                                 macrostring ',' {if (! $3) skip--; else skip++;}
+                                 macrostring ')' {if (  $3) skip--;} |
+		VOID_FUNCTION_VOID
+			'(' ')'
+			{if (! skip) (*$1)();} |
+		VOID_FUNCTION_STRING
+			'(' STRING ')'
+			{if (! skip) (*$1)($3);} |
+		VOID_FUNCTION_2STRING
+			'(' STRING ',' STRING ')'
+			{if (! skip) (*$1)($3, $5);} |
+		VOID_FUNCTION_2STRING_UINT
+			'(' STRING ',' STRING ',' INTEGER ')'
+			{if (! skip) (*$1)($3, $5, $7);} |
+		VOID_FUNCTION_2STRING_UINT_STRING
+			'(' STRING ',' STRING ',' INTEGER ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7, $9);} |
+		VOID_FUNCTION_2STRING_2UINT_2STRING
+			'(' STRING ',' STRING ',' INTEGER ',' INTEGER ',' STRING ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} |
+		VOID_FUNCTION_2STRING_WPARAM_LPARAM_STRING
+			'(' STRING ',' STRING ',' INTEGER ',' INTEGER ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7, $9, $11);} |
+		VOID_FUNCTION_3STRING
+			'(' STRING ',' STRING ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7);} |
+		VOID_FUNCTION_3STRING_2UINT
+			'(' STRING ',' STRING ',' STRING ',' INTEGER ',' INTEGER ')'
+			{if (! skip) (*$1)($3, $5, $7, $9, $11);} |
+		VOID_FUNCTION_4STRING
+			'(' STRING ',' STRING ',' STRING ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7, $9);} |
+		VOID_FUNCTION_4STRING_UINT
+			'(' STRING ',' STRING ',' STRING ',' STRING ',' INTEGER')'
+			{if (! skip) (*$1)($3, $5, $7, $9, $11);} |
+		VOID_FUNCTION_4STRING_2UINT
+			'(' STRING ',' STRING ',' STRING ',' STRING ',' INTEGER ',' INTEGER')'
+			{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} |
+		VOID_FUNCTION_STRING_UINT
+			'(' STRING ',' INTEGER ')'
+			{if (! skip) (*$1)($3, $5);} |
+		VOID_FUNCTION_STRING_UINT_STRING
+			'(' STRING ',' INTEGER ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7);} |
+		VOID_FUNCTION_STRING_UINT_2STRING
+			'(' STRING ',' INTEGER ',' STRING ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7, $9);} |
+		VOID_FUNCTION_STRING_WPARAM_LPARAM
+			'(' STRING ',' INTEGER ',' INTEGER ')'
+			{if (! skip) (*$1)($3, $5, $7);} |
+		VOID_FUNCTION_UINT
+			'(' INTEGER ')'
+			{if (! skip) (*$1)($3);} |
+		VOID_FUNCTION_2UINT
+			'(' INTEGER ',' INTEGER ')'
+			{if (! skip) (*$1)($3, $5);} |
+		VOID_FUNCTION_2UINT_STRING
+			'(' INTEGER ',' INTEGER ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7);} |
+		VOID_FUNCTION_3UINT
+			'(' INTEGER ',' INTEGER ',' INTEGER ')'
+			{if (! skip) (*$1)($3, $5, $7);} |
+		VOID_FUNCTION_2INT_3UINT_STRING
+			'(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ',' STRING ')'
+			{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} |
+		VOID_FUNCTION_FILE_WIN
+			'(' filename STRING ')'
+			{if (! skip) (*$1)($3, $4);} |
+		VOID_FUNCTION_FILE_WIN_STRING
+			'(' filename STRING ',' STRING ')'
+			{if (! skip) (*$1)($3, $4, $6);} |
+		VOID_FUNCTION_FILE_WIN_UINT
+			'(' filename STRING ',' INTEGER ')'
+			{if (! skip) (*$1)($3, $4, $6);} ;
+
+filename:	{MACRO_extra_separator = '>'} STRING {$$ = $2;} ;
+
+bool_macro:     NOT '(' bool_macro ')' {$$ = ! $3;} |
+		STRING {$$ = MACRO_IsMark($1);} |
+		BOOL_FUNCTION_VOID '(' ')' {$$ = (*$1)();} |
+		BOOL_FUNCTION_STRING '(' STRING ')' {$$ = (*$1)($3);} ;
diff --git a/programs/winhelp/string.c b/programs/winhelp/string.c
new file mode 100644
index 0000000..647b968
--- /dev/null
+++ b/programs/winhelp/string.c
@@ -0,0 +1,25 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#include <windows.h>
+#include "winhelp.h"
+
+/* Class names */
+
+CHAR MAIN_WIN_CLASS_NAME[]       = "WHMain";
+CHAR BUTTON_BOX_WIN_CLASS_NAME[] = "WHButtonBox";
+CHAR TEXT_WIN_CLASS_NAME[]       = "WHText";
+CHAR SHADOW_WIN_CLASS_NAME[]     = "WHShadow";
+CHAR STRING_BUTTON[]             = "BUTTON";
+
+/* Resource names */
+/* Xx will be overwritten with En, ... */
+CHAR STRING_MENU_Xx[]        = "MENU_Xx";
+CHAR STRING_DIALOG_TEST[]    = "DIALOG_TEST";
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
new file mode 100644
index 0000000..c7244b0
--- /dev/null
+++ b/programs/winhelp/winhelp.c
@@ -0,0 +1,1069 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid <uschmid@mail.hh.provi.de>
+ */
+
+#include <stdio.h>
+#include <windows.h>
+#ifdef WINELIB
+#include <resource.h>
+#include <options.h>
+#include <shell.h>
+extern const char people[];
+#endif
+#include "winhelp.h"
+
+VOID LIBWINE_Register_De(void);
+VOID LIBWINE_Register_En(void);
+
+static BOOL    WINHELP_RegisterWinClasses();
+static LRESULT WINHELP_MainWndProc(HWND, UINT, WPARAM, LPARAM);
+static LRESULT WINHELP_TextWndProc(HWND, UINT, WPARAM, LPARAM);
+static LRESULT WINHELP_ButtonBoxWndProc(HWND, UINT, WPARAM, LPARAM);
+static VOID    WINHELP_CheckPopup(UINT);
+static BOOL    WINHELP_SplitLines(HWND hWnd, LPSIZE);
+static VOID    WINHELP_InitFonts(HWND hWnd);
+static VOID    WINHELP_DeleteLines(WINHELP_WINDOW*);
+static VOID    WINHELP_DeleteWindow(WINHELP_WINDOW*);
+static VOID    WINHELP_SetupText(HWND hWnd);
+static BOOL    WINHELP_AppendText(WINHELP_LINE***, WINHELP_LINE_PART***,
+				  LPSIZE, LPSIZE, INT*, INT, LPCSTR, UINT,
+				  HFONT, COLORREF, HLPFILE_LINK*);
+
+WINHELP_GLOBALS Globals = {3, 0, 0, 0, 0, 0};
+
+static BOOL MacroTest = FALSE;
+
+/***********************************************************************
+ *
+ *           WinMain
+ */
+
+int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
+{
+  LPCSTR opt_lang = "En";
+  CHAR   lang[3];
+  MSG    msg;
+  LONG   lHash = 0;
+  INT    langnum;
+
+#if defined(WINELIB) && !defined(HAVE_WINE_CONSTRUCTOR)
+  /* Register resources */
+  LIBWINE_Register_De();
+  LIBWINE_Register_En();
+#endif
+
+  Globals.hInstance = hInstance;
+
+  /* Get options */
+  while (*cmdline && (*cmdline == ' ' || *cmdline == '-'))
+    {
+      CHAR   option;
+      LPCSTR topic_id;
+      if (*cmdline++ == ' ') continue;
+
+      option = *cmdline;
+      if (option) cmdline++;
+      while (*cmdline && *cmdline == ' ') cmdline++;
+      switch(option)
+	{
+	case 'i':
+	case 'I':
+	  topic_id = cmdline;
+	  while (*cmdline && *cmdline != ' ') cmdline++;
+	  if (*cmdline) *cmdline++ = '\0';
+	  lHash = HLPFILE_Hash(topic_id);
+	  break;
+
+	case '3':
+	case '4':
+	  Globals.wVersion = option - '0';
+	  break;
+
+	case 't':
+	  MacroTest = TRUE;
+	  break;
+	}
+    }
+
+#ifdef WINELIB
+  opt_lang = langNames[Options.language];
+#endif
+
+  /* Find language specific string table */
+  for (langnum = 0; langnum <= MAX_LANGUAGE_NUMBER; langnum++)
+    {
+      Globals.wStringTableOffset = langnum * 0x100;
+      if (LoadString(hInstance, IDS_LANGUAGE_ID, lang, sizeof(lang)) &&
+	  !lstrcmp(opt_lang, lang))
+	break;
+    }
+  if (langnum > MAX_LANGUAGE_NUMBER)
+    {
+      /* Find fallback language */
+      for (langnum = 0; langnum <= MAX_LANGUAGE_NUMBER; langnum++)
+	{
+	  Globals.wStringTableOffset = langnum * 0x100;
+	  if (LoadString(hInstance, IDS_LANGUAGE_ID, lang, sizeof(lang)))
+	    break;
+	}
+      if (langnum > MAX_LANGUAGE_NUMBER)
+	{
+	MessageBox(0, "No language found", "FATAL ERROR", MB_OK);
+	return(1);
+	}
+    }
+
+  /* Change Resource names */
+  lstrcpyn(STRING_MENU_Xx + lstrlen(STRING_MENU_Xx) - 2, lang, 3);
+
+  /* Create primary window */
+  WINHELP_RegisterWinClasses();
+  WINHELP_CreateHelpWindow(cmdline, lHash, "main", FALSE, NULL, NULL, show);
+
+  /* Message loop */
+  while (GetMessage (&msg, 0, 0, 0))
+    {
+      TranslateMessage (&msg);
+      DispatchMessage (&msg);
+    }
+  return 0;
+}
+
+/***********************************************************************
+ *
+ *           RegisterWinClasses
+ */
+
+static BOOL WINHELP_RegisterWinClasses()
+{
+  WNDCLASS class_main, class_button_box, class_text, class_shadow;
+
+  class_main.style               = CS_HREDRAW | CS_VREDRAW;
+  class_main.lpfnWndProc         = WINHELP_MainWndProc;
+  class_main.cbClsExtra          = 0;
+  class_main.cbWndExtra          = sizeof(LONG);
+  class_main.hInstance           = Globals.hInstance;
+  class_main.hIcon               = LoadIcon (0, IDI_APPLICATION);
+  class_main.hCursor             = LoadCursor (0, IDC_ARROW);
+  class_main.hbrBackground       = GetStockObject (WHITE_BRUSH);
+  class_main.lpszMenuName        = 0;
+  class_main.lpszClassName       = MAIN_WIN_CLASS_NAME;
+
+  class_button_box               = class_main;
+  class_button_box.lpfnWndProc   = WINHELP_ButtonBoxWndProc;
+  class_button_box.hbrBackground = GetStockObject(GRAY_BRUSH);
+  class_button_box.lpszClassName = BUTTON_BOX_WIN_CLASS_NAME;
+
+  class_text = class_main;
+  class_text.lpfnWndProc         = WINHELP_TextWndProc;
+  class_text.lpszClassName       = TEXT_WIN_CLASS_NAME;
+
+  class_shadow = class_main;
+  class_shadow.lpfnWndProc       = DefWindowProc;
+  class_shadow.hbrBackground     = GetStockObject(GRAY_BRUSH);
+  class_shadow.lpszClassName     = SHADOW_WIN_CLASS_NAME;
+
+  return (RegisterClass(&class_main) &&
+	  RegisterClass(&class_button_box) &&
+	  RegisterClass(&class_text) &&
+	  RegisterClass(&class_shadow));
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_CreateHelpWindow
+ */
+
+VOID WINHELP_CreateHelpWindow(LPCSTR lpszFile, LONG lHash, LPCSTR lpszWindow,
+			      BOOL bPopup, HWND hParentWnd, LPPOINT mouse, INT nCmdShow)
+{
+  CHAR    szCaption[MAX_STRING_LEN];
+  CHAR    szContents[MAX_STRING_LEN];
+  CHAR    szSearch[MAX_STRING_LEN];
+  CHAR    szBack[MAX_STRING_LEN];
+  CHAR    szHistory[MAX_STRING_LEN];
+  SIZE    size   = {CW_USEDEFAULT, CW_USEDEFAULT};
+  POINT   origin = {240, 0};
+  LPSTR   ptr;
+  HGLOBAL handle;
+  WINHELP_WINDOW *win, *oldwin;
+  HLPFILE_PAGE   *page;
+  HLPFILE_MACRO  *macro;
+  HWND hWnd;
+  BOOL bPrimary;
+
+  if (bPopup)
+    lpszWindow = NULL;
+  else if (!lpszWindow)
+    lpszWindow = Globals.active_win->lpszName;
+  bPrimary = lpszWindow && !lstrcmpi(lpszWindow, "main");
+
+  /* Read help file */
+  if (lpszFile[0])
+    {
+      page = lHash ? HLPFILE_PageByHash(lpszFile, lHash) : HLPFILE_Contents(lpszFile);
+
+      /* Add Suffix `.hlp' */
+      if (!page && lstrcmpi(lpszFile + strlen(lpszFile) - 4, ".hlp"))
+	{
+	  CHAR      szFile_hlp[MAX_PATHNAME_LEN];
+
+	  lstrcpyn(szFile_hlp, lpszFile, sizeof(szFile_hlp) - 4);
+	  szFile_hlp[sizeof(szFile_hlp) - 5] = '\0';
+	  lstrcat(szFile_hlp, ".hlp");
+
+	  page = lHash ? HLPFILE_PageByHash(szFile_hlp, lHash) : HLPFILE_Contents(szFile_hlp);
+	  if (!page)
+	    {
+	      WINHELP_MessageBoxIDS_s(IDS_HLPFILE_ERROR_s, lpszFile, IDS_ERROR, MB_OK);
+	      if (Globals.win_list) return;
+	    }
+	}
+    }
+  else page = 0;
+
+  /* Calculate horizontal size and position of a popup window */
+  if (bPopup)
+    {
+      RECT parent_rect;
+      GetWindowRect(hParentWnd, &parent_rect);
+      size.cx = (parent_rect.right  - parent_rect.left) / 2;
+
+      origin = *mouse;
+      ClientToScreen(hParentWnd, &origin);
+      origin.x -= size.cx / 2;
+      origin.x  = MIN(origin.x, GetSystemMetrics(SM_CXSCREEN) - size.cx);
+      origin.x  = MAX(origin.x, 0);
+    }
+
+  /* Initialize WINHELP_WINDOW struct */
+  handle = GlobalAlloc(GMEM_FIXED, sizeof(WINHELP_WINDOW) +
+		       (lpszWindow ? strlen(lpszWindow) + 1 : 0));
+  if (!handle) return;
+  win = GlobalLock(handle);
+  win->hSelf = handle;
+  win->next  = Globals.win_list;
+  Globals.win_list = win;
+  if (lpszWindow)
+    {
+      ptr = GlobalLock(handle);
+      ptr += sizeof(WINHELP_WINDOW);
+      lstrcpy(ptr, (LPSTR) lpszWindow);
+      win->lpszName = ptr;
+    }
+  else win->lpszName = NULL;
+  win->page = page;
+  win->first_button = 0;
+  win->first_line = 0;
+  win->hMainWnd = 0;
+  win->hButtonBoxWnd = 0;
+  win->hTextWnd = 0;
+  win->hShadowWnd = 0;
+
+  Globals.active_win = win;
+
+  /* Initialize default pushbuttons */
+  if (MacroTest && !bPopup)
+    MACRO_CreateButton("BTN_TEST", "&Test", "MacroTest");
+  if (bPrimary && page)
+    {
+      LoadString(Globals.hInstance, IDS_CONTENTS, szContents, sizeof(szContents));
+      LoadString(Globals.hInstance, IDS_SEARCH,   szSearch,   sizeof(szSearch));
+      LoadString(Globals.hInstance, IDS_BACK,     szBack,     sizeof(szBack));
+      LoadString(Globals.hInstance, IDS_HISTORY,  szHistory,  sizeof(szHistory));
+      MACRO_CreateButton("BTN_CONTENTS", szContents, "Contents()");
+      MACRO_CreateButton("BTN_SEARCH",   szSearch,   "Search()");
+      MACRO_CreateButton("BTN_BACK",     szBack,     "Back()");
+      MACRO_CreateButton("BTN_HISTORY",  szHistory,  "History()");
+    }
+
+  /* Initialize file specific pushbuttons */
+  if (!bPopup && page)
+    for (macro = page->file->first_macro; macro; macro = macro->next)
+      MACRO_ExecuteMacro(macro->lpszMacro);
+
+  /* Reuse existing window */
+  if (lpszWindow)
+    for (oldwin = win->next; oldwin; oldwin = oldwin->next)
+      if (oldwin->lpszName && !lstrcmpi(oldwin->lpszName, lpszWindow))
+	{
+	  WINHELP_BUTTON *button;
+
+	  win->hMainWnd      = oldwin->hMainWnd;
+	  win->hButtonBoxWnd = oldwin->hButtonBoxWnd;
+	  win->hTextWnd      = oldwin->hTextWnd;
+	  oldwin->hMainWnd = oldwin->hButtonBoxWnd = oldwin->hTextWnd = 0;
+
+	  SetWindowLong(win->hMainWnd,      0, (LONG) win);
+	  SetWindowLong(win->hButtonBoxWnd, 0, (LONG) win);
+	  SetWindowLong(win->hTextWnd,      0, (LONG) win);
+
+	  WINHELP_InitFonts(win->hMainWnd);
+
+	  SetWindowText(win->hMainWnd, page->file->lpszTitle);
+
+	  WINHELP_SetupText(win->hTextWnd);
+	  InvalidateRect(win->hTextWnd, NULL, TRUE);
+	  SendMessage(win->hMainWnd, WM_USER, 0, 0);
+	  UpdateWindow(win->hTextWnd);
+
+
+	  for (button = oldwin->first_button; button; button = button->next)
+	    DestroyWindow(button->hWnd);
+  
+	  WINHELP_DeleteWindow(oldwin);
+	  return;
+	}
+
+  /* Create main Window */
+  if (!page) LoadString(Globals.hInstance, IDS_WINE_HELP, szCaption, sizeof(szCaption));
+  hWnd = CreateWindow (bPopup ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
+		       page ? (SEGPTR) page->file->lpszTitle : (SEGPTR) szCaption,
+		       bPopup ? WS_POPUPWINDOW | WS_BORDER : WS_OVERLAPPEDWINDOW,
+		       origin.x, origin.y, size.cx, size.cy,
+		       0, bPrimary ? LoadMenu(Globals.hInstance, STRING_MENU_Xx) : 0,
+		       Globals.hInstance, (SEGPTR) win);
+
+  ShowWindow (hWnd, nCmdShow);
+  UpdateWindow (hWnd);
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_MainWndProc
+ */
+
+static LRESULT WINHELP_MainWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+  WINHELP_WINDOW *win;
+  WINHELP_BUTTON *button;
+  RECT rect, button_box_rect;
+  INT  text_top;
+
+  WINHELP_CheckPopup(msg);
+
+  switch (msg)
+    {
+    case WM_NCCREATE:
+      win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams;
+      SetWindowLong(hWnd, 0, (LONG) win);
+      win->hMainWnd = hWnd;
+      break;
+
+    case WM_CREATE:
+      win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+
+      /* Create button box and text Window */
+      CreateWindow(BUTTON_BOX_WIN_CLASS_NAME, "", WS_CHILD | WS_VISIBLE,
+		   0, 0, 0, 0, hWnd, 0, Globals.hInstance, (SEGPTR) win);
+
+      CreateWindow(TEXT_WIN_CLASS_NAME, "", WS_CHILD | WS_VISIBLE,
+		   0, 0, 0, 0, hWnd, 0, Globals.hInstance, (SEGPTR) win);
+
+      /* Fall through */
+    case WM_USER:
+    case WM_WINDOWPOSCHANGED:
+      win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+      GetClientRect(hWnd, &rect);
+
+      /* Update button box and text Window */
+      SetWindowPos(win->hButtonBoxWnd, HWND_TOP,
+		   rect.left, rect.top,
+		   rect.right - rect.left,
+		   rect.bottom - rect.top, 0);
+
+      GetWindowRect(win->hButtonBoxWnd, &button_box_rect);
+      text_top = rect.top + button_box_rect.bottom - button_box_rect.top;
+
+      SetWindowPos(win->hTextWnd, HWND_TOP,
+		   rect.left, text_top,
+		   rect.right - rect.left,
+		   rect.bottom - text_top, 0);
+
+      break;
+
+    case WM_COMMAND:
+      Globals.active_win = win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+      switch (wParam)
+	{
+	  /* Menu FILE */
+	case WH_OPEN:            MACRO_FileOpen();       break;
+	case WH_PRINT:           MACRO_Print();          break;
+	case WH_PRINTER_SETUP:   MACRO_PrinterSetup();   break;
+	case WH_EXIT:            MACRO_Exit();           break;
+
+	  /* Menu EDIT */
+	case WH_COPY_DIALOG:     MACRO_CopyDialog();     break;
+	case WH_ANNOTATE:        MACRO_Annotate();       break;
+
+	  /* Menu Bookmark */
+	case WH_BOOKMARK_DEFINE: MACRO_BookmarkDefine(); break;
+
+	  /* Menu Help */
+	case WH_HELP_ON_HELP:    MACRO_HelpOn();         break;
+	case WH_HELP_ON_TOP:     MACRO_HelpOnTop();      break;
+
+	  /* Menu Info */
+	case WH_ABOUT:           MACRO_About();          break;
+#ifdef WINELIB
+	case WH_ABOUT_WINE: 
+	  ShellAbout(hWnd, "WINE", people, 0);
+	  break;
+#endif
+
+	default:
+	  /* Buttons */
+	  for (button = win->first_button; button; button = button->next)
+	    if (wParam == button->wParam) break;
+	  if (button)
+	    MACRO_ExecuteMacro(button->lpszMacro);
+	  else
+	    WINHELP_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
+	  break;
+	}
+      break;
+    }
+
+  return DefWindowProc (hWnd, msg, wParam, lParam);
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_ButtonBoxWndProc
+ */
+
+static LRESULT WINHELP_ButtonBoxWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+  WINDOWPOS      *winpos;
+  WINHELP_WINDOW *win;
+  WINHELP_BUTTON *button;
+  SIZE button_size;
+  INT  x, y;
+
+  WINHELP_CheckPopup(msg);
+
+  switch(msg)
+    {
+    case WM_NCCREATE:
+      win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams;
+      SetWindowLong(hWnd, 0, (LONG) win);
+      win->hButtonBoxWnd = hWnd;
+      break;
+
+    case WM_WINDOWPOSCHANGING:
+      winpos = (WINDOWPOS*) lParam;
+      win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+
+      /* Update buttons */
+      button_size.cx = 0;
+      button_size.cy = 0;
+      for (button = win->first_button; button; button = button->next)
+	{
+	  HDC  hDc;
+	  SIZE textsize;
+	  if (!button->hWnd)
+	    button->hWnd = CreateWindow(STRING_BUTTON, (LPSTR) button->lpszName,
+					WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
+					0, 0, 0, 0,
+					hWnd, (HMENU) button->wParam,
+					Globals.hInstance, 0);
+	  hDc = GetDC(button->hWnd);
+	  GetTextExtentPoint(hDc, button->lpszName,
+			     lstrlen(button->lpszName), &textsize);
+	  ReleaseDC(button->hWnd, hDc);
+
+	  button_size.cx = MAX(button_size.cx, textsize.cx + BUTTON_CX);
+	  button_size.cy = MAX(button_size.cy, textsize.cy + BUTTON_CY);
+	}
+
+      x = 0;
+      y = 0;
+      for (button = win->first_button; button; button = button->next)
+	{
+	  SetWindowPos(button->hWnd, HWND_TOP, x, y, button_size.cx, button_size.cy, 0);
+
+	  if (x + 2 * button_size.cx <= winpos->cx)
+	    x += button_size.cx;
+	  else
+	    x = 0, y += button_size.cy;
+	}
+      winpos->cy = y + (x ? button_size.cy : 0);
+      break;
+
+    case WM_COMMAND:
+      SendMessage(GetParent(hWnd), msg, wParam, lParam);
+      break;
+    }
+
+  return(DefWindowProc(hWnd, msg, wParam, lParam));
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_TextWndProc
+ */
+
+static LRESULT WINHELP_TextWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+  WINHELP_WINDOW    *win;
+  WINHELP_LINE      *line;
+  WINHELP_LINE_PART *part;
+  WINDOWPOS         *winpos;
+  PAINTSTRUCT        ps;
+  HDC   hDc;
+  POINT mouse;
+  INT   scroll_pos;
+  HWND  hPopupWnd;
+  BOOL  bExit;
+
+  if (msg != WM_LBUTTONDOWN)
+    WINHELP_CheckPopup(msg);
+
+  switch (msg)
+    {
+    case WM_NCCREATE:
+      win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams;
+      SetWindowLong(hWnd, 0, (LONG) win);
+      win->hTextWnd = hWnd;
+      if (!win->lpszName) Globals.hPopupWnd = win->hMainWnd = hWnd;
+      WINHELP_InitFonts(hWnd);
+      break;
+
+    case WM_CREATE:
+      win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+
+      /* Calculate vertical size and position of a popup window */
+      if (!win->lpszName)
+	{
+	  POINT origin;
+	  RECT old_window_rect;
+	  RECT old_client_rect;
+	  SIZE old_window_size;
+	  SIZE old_client_size;
+	  SIZE new_client_size;
+	  SIZE new_window_size;
+
+	  GetWindowRect(hWnd, &old_window_rect);
+	  origin.x = old_window_rect.left;
+	  origin.y = old_window_rect.top;
+	  old_window_size.cx = old_window_rect.right  - old_window_rect.left;
+	  old_window_size.cy = old_window_rect.bottom - old_window_rect.top;
+
+	  GetClientRect(hWnd, &old_client_rect);
+	  old_client_size.cx = old_client_rect.right  - old_client_rect.left;
+	  old_client_size.cy = old_client_rect.bottom - old_client_rect.top;
+
+	  new_client_size = old_client_size;
+	  WINHELP_SplitLines(hWnd, &new_client_size);
+
+	  if (origin.y + POPUP_YDISTANCE + new_client_size.cy <= GetSystemMetrics(SM_CYSCREEN))
+	    origin.y += POPUP_YDISTANCE;
+	  else
+	    origin.y -= POPUP_YDISTANCE + new_client_size.cy;
+
+	  new_window_size.cx = old_window_size.cx - old_client_size.cx + new_client_size.cx;
+	  new_window_size.cy = old_window_size.cy - old_client_size.cy + new_client_size.cy;
+
+	  win->hShadowWnd = 
+	    CreateWindow(SHADOW_WIN_CLASS_NAME, "", WS_POPUP | WS_VISIBLE,
+			 origin.x + SHADOW_DX, origin.y + SHADOW_DY,
+			 new_window_size.cx, new_window_size.cy,
+			 0, 0, Globals.hInstance, 0);
+
+	  SetWindowPos(hWnd, HWND_TOP, origin.x, origin.y,
+		       new_window_size.cx, new_window_size.cy,
+		       SWP_NOZORDER | SWP_NOACTIVATE);
+	  ShowWindow(win->hShadowWnd, SW_NORMAL);
+	}
+      break;
+
+    case WM_WINDOWPOSCHANGED:
+      winpos = (WINDOWPOS*) lParam;
+      if (!(winpos->flags & SWP_NOSIZE)) WINHELP_SetupText(hWnd);
+      break;
+
+    case WM_VSCROLL:
+      {
+	BOOL update = TRUE;
+	RECT rect;
+	INT  Min, Max;
+	INT  CurPos = GetScrollPos(hWnd, SB_VERT);
+	GetScrollRange(hWnd, SB_VERT, &Min, &Max);
+	GetClientRect(hWnd, &rect);
+
+	switch (wParam & 0xffff)
+	  {
+	  case SB_THUMBTRACK:
+	  case SB_THUMBPOSITION: CurPos  = wParam >> 16;                   break;
+	  case SB_TOP:           CurPos  = Min;                            break;
+	  case SB_BOTTOM:        CurPos  = Max;                            break;
+	  case SB_PAGEUP:        CurPos -= (rect.bottom - rect.top) / 2;   break;
+	  case SB_PAGEDOWN:      CurPos += (rect.bottom - rect.top) / 2;   break;
+	  case SB_LINEUP:        CurPos -= GetSystemMetrics(SM_CXVSCROLL); break;
+	  case SB_LINEDOWN:      CurPos += GetSystemMetrics(SM_CXVSCROLL); break;
+	  default: update = FALSE;
+	  }
+	if (update)
+	  {
+	    INT dy = GetScrollPos(hWnd, SB_VERT) - CurPos;
+	    SetScrollPos(hWnd, SB_VERT, CurPos, TRUE);
+	    ScrollWindow(hWnd, 0, dy, NULL, NULL);
+	    UpdateWindow(hWnd);
+	  }
+      }
+      break;
+
+    case WM_PAINT:
+      hDc = BeginPaint (hWnd, &ps);
+      win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+      scroll_pos = GetScrollPos(hWnd, SB_VERT);
+
+      for (line = win->first_line; line; line = line->next)
+	for (part = &line->first_part; part; part = part->next)
+	  {
+	    SelectObject(hDc, part->hFont);
+	    SetTextColor(hDc, part->color);
+	    TextOut(hDc, part->rect.left, part->rect.top - scroll_pos,
+		    (LPSTR) part->lpsText, part->wTextLen);
+	  }
+
+      EndPaint (hWnd, &ps);
+      break;
+
+    case WM_LBUTTONDOWN:
+      win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+      scroll_pos = GetScrollPos(hWnd, SB_VERT);
+
+      hPopupWnd = Globals.hPopupWnd;
+      Globals.hPopupWnd = 0;
+
+      mouse.x = LOWORD(lParam);
+      mouse.y = HIWORD(lParam);
+      for (line = win->first_line; line; line = line->next)
+	for (part = &line->first_part; part; part = part->next)
+	  if (part->link.lpszPath &&
+	      part->rect.left   <= mouse.x &&
+	      part->rect.right  >= mouse.x &&
+	      part->rect.top    <= mouse.y + scroll_pos &&
+	      part->rect.bottom >= mouse.y + scroll_pos)
+	    WINHELP_CreateHelpWindow(part->link.lpszPath, part->link.lHash, NULL,
+				     part->link.bPopup, hWnd, &mouse,  SW_NORMAL);
+      if (hPopupWnd)
+	DestroyWindow(hPopupWnd);
+      break;
+
+    case WM_NCDESTROY:
+      win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+
+      if (hWnd == Globals.hPopupWnd) Globals.hPopupWnd = 0;
+
+      bExit = (Globals.wVersion >= 4 && !lstrcmpi(win->lpszName, "main"));
+
+      WINHELP_DeleteWindow(win);
+
+      if (bExit) MACRO_Exit();
+
+      if (!Globals.win_list)
+	PostQuitMessage (0);
+      break;
+    }
+
+  return DefWindowProc (hWnd, msg, wParam, lParam);
+}
+
+/***********************************************************************
+ *
+ *           SetupText
+ */
+
+static VOID WINHELP_SetupText(HWND hWnd)
+{
+  HDC  hDc = GetDC(hWnd);
+  RECT rect;
+  SIZE newsize;
+
+  ShowScrollBar(hWnd, SB_VERT, FALSE);
+  if (!WINHELP_SplitLines(hWnd, NULL))
+    {
+      ShowScrollBar(hWnd, SB_VERT, TRUE);
+      GetClientRect(hWnd, &rect);
+
+      WINHELP_SplitLines(hWnd, &newsize);
+      SetScrollRange(hWnd, SB_VERT, 0, rect.top + newsize.cy - rect.bottom, TRUE);
+    }
+  else SetScrollPos(hWnd, SB_VERT, 0, FALSE);
+
+  ReleaseDC(hWnd, hDc);
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_SplitLines
+ */
+
+static BOOL WINHELP_SplitLines(HWND hWnd, LPSIZE newsize)
+{
+  WINHELP_WINDOW     *win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+  HLPFILE_PARAGRAPH  *p;
+  WINHELP_LINE      **line = &win->first_line;
+  WINHELP_LINE_PART **part = 0;
+  INT                 line_ascent = 0;
+  SIZE                space;
+  RECT                rect;
+  HDC                 hDc;
+
+  if (newsize) newsize->cx = newsize->cy = 0;
+
+  if (!win->page) return TRUE;
+
+  WINHELP_DeleteLines(win);
+
+  GetClientRect(hWnd, &rect);
+
+  rect.top    += INTERNAL_BORDER_WIDTH;
+  rect.left   += INTERNAL_BORDER_WIDTH;
+  rect.right  -= INTERNAL_BORDER_WIDTH;
+  rect.bottom -= INTERNAL_BORDER_WIDTH;
+
+
+  space.cy = rect.top;
+  space.cx = rect.left;
+
+  hDc = GetDC(hWnd);
+
+  for (p = win->page->first_paragraph; p; p = p->next)
+    {
+      TEXTMETRIC tm;
+      SIZE textsize = {0, 0};
+      LPCSTR text    = p->lpszText;
+      UINT len    = strlen(text);
+      UINT indent = 0;
+
+      UINT  wFont      = (p->wFont < win->fonts_len) ? p->wFont : 0;
+      BOOL  bUnderline = p->link && !p->link->bPopup;
+      HFONT hFont      = win->fonts[wFont][bUnderline ? 1 : 0];
+
+      COLORREF       color = RGB(0, 0, 0);
+      if (p->link)   color = RGB(0, 0x80, 0);
+      if (p->bDebug) color = RGB(0xff, 0, 0);
+
+      SelectObject(hDc, hFont);
+
+      GetTextMetrics (hDc, &tm);
+
+      if (p->wIndent)
+	{
+	  indent = p->wIndent * 5 * tm.tmAveCharWidth;
+	  if (!part)
+	    space.cx = rect.left + indent - 2 * tm.tmAveCharWidth;
+	}
+
+      if (p->wVSpace)
+	{
+	  part = 0;
+	  space.cx = rect.left + indent;
+	  space.cy += (p->wVSpace - 1) * tm.tmHeight;
+	}
+
+      if (p->wHSpace)
+	{
+	  space.cx += p->wHSpace * 2 * tm.tmAveCharWidth;
+	}
+
+      while (len)
+	{
+	  INT free_width = rect.right - (part ? (*line)->rect.right : rect.left) - space.cx;
+	  UINT low = 0, curr = len, high = len, textlen;
+
+	  if (free_width > 0)
+	    {
+	      while (1)
+		{
+		  GetTextExtentPoint(hDc, text, curr, &textsize);
+
+		  if (textsize.cx <= free_width) low = curr;
+		  else high = curr;
+
+		  if (high <= low + 1) break;
+
+		  if (textsize.cx) curr = (curr * free_width) / textsize.cx;
+		  if (curr <= low)  curr = low + 1;
+		  else if (curr >= high) curr = high - 1;
+		}
+	      textlen = low;
+	      while (textlen && text[textlen] && text[textlen] != ' ') textlen--;
+	    }
+	  if (!part && !textlen) textlen = MAX(low, 1);
+
+	  if (free_width <= 0 || !textlen)
+	    {
+	      part = 0;
+	      space.cx = rect.left + indent;
+	      space.cx = MIN(space.cx, rect.right - rect.left - 1);
+	      continue;
+	    }
+
+	  if (!WINHELP_AppendText(&line, &part, &space, &textsize,
+				  &line_ascent, tm.tmAscent,
+				  text, textlen, hFont, color, p->link) ||
+	      (!newsize && (*line)->rect.bottom > rect.bottom))
+	    {
+	      ReleaseDC(hWnd, hDc);
+	      return FALSE;
+	    }
+
+	  if (newsize)
+	    newsize->cx = MAX(newsize->cx, (*line)->rect.right + INTERNAL_BORDER_WIDTH);
+
+	  len -= textlen;
+	  text += textlen;
+	  if (text[0] == ' ') text++, len--;
+	}
+    }
+
+  if (newsize)
+    newsize->cy = (*line)->rect.bottom + INTERNAL_BORDER_WIDTH;
+
+  ReleaseDC(hWnd, hDc);
+  return TRUE;
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_AppendText
+ */
+
+static BOOL WINHELP_AppendText(WINHELP_LINE ***linep, WINHELP_LINE_PART ***partp,
+			       LPSIZE space, LPSIZE textsize,
+			       INT *line_ascent, INT ascent,
+			       LPCSTR text, UINT textlen,
+			       HFONT font, COLORREF color, HLPFILE_LINK *link)
+{
+  HGLOBAL handle;
+  WINHELP_LINE      *line;
+  WINHELP_LINE_PART *part;
+  LPSTR ptr;
+
+  if (!*partp) /* New line */
+    {
+      *line_ascent  = ascent;
+
+      handle = GlobalAlloc(GMEM_FIXED, sizeof(WINHELP_LINE) + textlen +
+			   (link ? lstrlen(link->lpszPath) + 1 : 0));
+      if (!handle) return FALSE;
+      line          = GlobalLock(handle);
+      line->next    = 0;
+      part          = &line->first_part;
+      ptr           = GlobalLock(handle);
+      ptr          += sizeof(WINHELP_LINE);
+
+      line->rect.top    = (**linep ? (**linep)->rect.bottom : 0) + space->cy;
+      line->rect.bottom = line->rect.top;
+      line->rect.left   = space->cx;
+      line->rect.right  = space->cx;
+
+      if (**linep) *linep = &(**linep)->next; 
+      **linep = line;
+      space->cy = 0;
+    }
+  else /* Same line */
+    {
+      line = **linep;
+
+      if (*line_ascent < ascent)
+	{
+	  WINHELP_LINE_PART *p;
+	  for (p = &line->first_part; p; p = p->next)
+	    {
+	      p->rect.top    += ascent - *line_ascent;
+	      p->rect.bottom += ascent - *line_ascent;
+	    }
+	  line->rect.bottom += ascent - *line_ascent;
+	  *line_ascent = ascent;
+	}
+
+      handle = GlobalAlloc(GMEM_FIXED, sizeof(WINHELP_LINE_PART) + textlen +
+			   (link ? lstrlen(link->lpszPath) + 1 : 0));
+      if (!handle) return FALSE;
+      part    = GlobalLock(handle);
+      **partp = part;
+      ptr     = GlobalLock(handle);
+      ptr    += sizeof(WINHELP_LINE_PART);
+    }
+
+  hmemcpy(ptr, text, textlen);
+  part->rect.left     = line->rect.right + (*partp ? space->cx : 0);
+  part->rect.right    = part->rect.left + textsize->cx;
+  line->rect.right    = part->rect.right;
+  part->rect.top      =
+    ((*partp) ? line->rect.top : line->rect.bottom) + *line_ascent - ascent;
+  part->rect.bottom   = part->rect.top + textsize->cy;
+  line->rect.bottom   = MAX(line->rect.bottom, part->rect.bottom);
+  part->hSelf         = handle;
+  part->lpsText       = ptr;
+  part->wTextLen      = textlen;
+  part->hFont         = font;
+  part->color         = color;
+  if (link)
+    {
+      strcpy(ptr + textlen, link->lpszPath);
+      part->link.lpszPath = ptr + textlen;
+      part->link.lHash    = link->lHash;
+      part->link.bPopup   = link->bPopup;
+    }
+  else part->link.lpszPath = 0;
+
+  part->next          = 0;
+  *partp              = &part->next;
+
+  space->cx = 0;
+
+  return TRUE;
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_CheckPopup
+ */
+
+static VOID WINHELP_CheckPopup(UINT msg)
+{
+  if (!Globals.hPopupWnd) return;
+
+  switch (msg)
+    {
+    case WM_COMMAND:
+    case WM_LBUTTONDOWN:
+    case WM_MBUTTONDOWN:
+    case WM_RBUTTONDOWN:
+    case WM_NCLBUTTONDOWN:
+    case WM_NCMBUTTONDOWN:
+    case WM_NCRBUTTONDOWN:
+      DestroyWindow(Globals.hPopupWnd);
+      Globals.hPopupWnd = 0;
+    }
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_DeleteLines
+ */
+
+static VOID WINHELP_DeleteLines(WINHELP_WINDOW *win)
+{
+  WINHELP_LINE      *line, *next_line;
+  WINHELP_LINE_PART *part, *next_part;
+  for(line = win->first_line; line; line = next_line)
+    {
+      next_line = line->next;
+      for(part = &line->first_part; part; part = next_part)
+	{
+	  next_part = part->next;
+	  GlobalFree(part->hSelf);
+	}
+    }
+  win->first_line = 0;
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_DeleteWindow
+ */
+
+static VOID WINHELP_DeleteWindow(WINHELP_WINDOW *win)
+{
+  WINHELP_WINDOW **w;
+
+  for (w = &Globals.win_list; *w; w = &(*w)->next)
+    if (*w == win)
+      {
+	*w = win->next;
+	break;
+      }
+
+  if (win->hShadowWnd) DestroyWindow(win->hShadowWnd);
+  HLPFILE_FreeHlpFilePage(win->page);
+  WINHELP_DeleteLines(win);
+  GlobalFree(win->hSelf);
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_InitFonts
+ */
+
+static VOID WINHELP_InitFonts(HWND hWnd)
+{
+  WINHELP_WINDOW *win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+  LOGFONT logfontlist[] = {
+    {-10, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 32, "Helv"},
+    {-12, 0, 0, 0, 700, 0, 0, 0, 0, 0, 0, 0, 32, "Helv"},
+    {-12, 0, 0, 0, 700, 0, 0, 0, 0, 0, 0, 0, 32, "Helv"},
+    {-12, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 32, "Helv"},
+    {-12, 0, 0, 0, 700, 0, 0, 0, 0, 0, 0, 0, 32, "Helv"},
+    {-10, 0, 0, 0, 700, 0, 0, 0, 0, 0, 0, 0, 32, "Helv"},
+    { -8, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 32, "Helv"}};
+#define FONTS_LEN (sizeof(logfontlist)/sizeof(*logfontlist))
+
+  static HFONT fonts[FONTS_LEN][2];
+  static BOOL init = 0;
+
+  win->fonts_len = FONTS_LEN;
+  win->fonts = fonts;
+
+  if (!init)
+    {
+      INT i;
+
+      for(i = 0; i < FONTS_LEN; i++)
+	{
+	  LOGFONT logfont = logfontlist[i];
+
+	  fonts[i][0] = CreateFontIndirect(&logfont);
+	  logfont.lfUnderline = 1;
+	  fonts[i][1] = CreateFontIndirect(&logfont);
+	}
+
+      init = 1;
+    }
+}
+
+/***********************************************************************
+ *
+ *           WINHELP_MessageBoxIDS
+ */
+
+INT WINHELP_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type)
+{
+  CHAR text[MAX_STRING_LEN];
+  CHAR title[MAX_STRING_LEN];
+
+  LoadString(Globals.hInstance, ids_text, text, sizeof(text));
+  LoadString(Globals.hInstance, ids_title, title, sizeof(title));
+
+  return(MessageBox(0, text, title, type));
+}
+
+/***********************************************************************
+ *
+ *           MAIN_MessageBoxIDS_s
+ */
+
+INT WINHELP_MessageBoxIDS_s(UINT ids_text, LPCSTR str, UINT ids_title, WORD type)
+{
+  CHAR text[MAX_STRING_LEN];
+  CHAR title[MAX_STRING_LEN];
+  CHAR newtext[MAX_STRING_LEN + MAX_PATHNAME_LEN];
+
+  LoadString(Globals.hInstance, ids_text, text, sizeof(text));
+  LoadString(Globals.hInstance, ids_title, title, sizeof(title));
+  wsprintf(newtext, text, str);
+
+  return(MessageBox(0, newtext, title, type));
+}
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */
diff --git a/programs/winhelp/winhelp.h b/programs/winhelp/winhelp.h
new file mode 100644
index 0000000..debf695
--- /dev/null
+++ b/programs/winhelp/winhelp.h
@@ -0,0 +1,156 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ */
+
+#define MAX_LANGUAGE_NUMBER 255
+#define MAX_PATHNAME_LEN   1024
+#define MAX_STRING_LEN      255
+
+#define INTERNAL_BORDER_WIDTH  5
+#define POPUP_YDISTANCE       20
+#define SHADOW_DX     20
+#define SHADOW_DY     20
+#define BUTTON_CX      6
+#define BUTTON_CY      6
+
+#ifndef RC_INVOKED
+
+#include "hlpfile.h"
+#include "macro.h"
+
+typedef struct tagHelpLinePart
+{
+  RECT      rect;
+  LPCSTR    lpsText;
+  UINT      wTextLen;
+  HFONT     hFont;
+  COLORREF  color;
+
+  struct
+  {
+  LPCSTR    lpszPath;
+  LONG      lHash;
+  BOOL      bPopup;
+  }         link;
+
+  HGLOBAL   hSelf;
+  struct tagHelpLinePart *next;
+} WINHELP_LINE_PART;
+
+typedef struct tagHelpLine
+{
+  RECT              rect;
+  WINHELP_LINE_PART first_part;
+  struct tagHelpLine *next;
+} WINHELP_LINE;
+
+typedef struct tagHelpButton
+{
+  HWND hWnd;
+
+  LPCSTR lpszID;
+  LPCSTR lpszName;
+  LPCSTR lpszMacro;
+
+  WPARAM wParam;
+
+  RECT rect;
+
+  HGLOBAL hSelf;
+  struct tagHelpButton *next;
+} WINHELP_BUTTON;
+
+typedef struct tagWinHelp
+{
+  LPCSTR lpszName;
+
+  WINHELP_BUTTON *first_button;
+  HLPFILE_PAGE   *page;
+  WINHELP_LINE   *first_line;
+
+  HWND hMainWnd;
+  HWND hButtonBoxWnd;
+  HWND hTextWnd;
+  HWND hShadowWnd;
+
+  HFONT (*fonts)[2];
+  UINT  fonts_len;
+
+  HGLOBAL hSelf;
+  struct tagWinHelp *next;
+} WINHELP_WINDOW;
+
+typedef struct
+{
+  UINT   wVersion;
+  HANDLE hInstance;
+  HWND   hPopupWnd;
+  UINT   wStringTableOffset;
+  WINHELP_WINDOW *active_win;
+  WINHELP_WINDOW *win_list;
+} WINHELP_GLOBALS;
+
+extern WINHELP_GLOBALS Globals;
+
+VOID WINHELP_CreateHelpWindow(LPCSTR, LONG, LPCSTR, BOOL, HWND, LPPOINT, INT);
+INT  WINHELP_MessageBoxIDS(UINT, UINT, WORD);
+INT  WINHELP_MessageBoxIDS_s(UINT, LPCSTR, UINT, WORD);
+
+extern CHAR MAIN_WIN_CLASS_NAME[];
+extern CHAR BUTTON_BOX_WIN_CLASS_NAME[];
+extern CHAR TEXT_WIN_CLASS_NAME[];
+extern CHAR SHADOW_WIN_CLASS_NAME[];
+extern CHAR STRING_BUTTON[];
+extern CHAR STRING_MENU_Xx[];
+extern CHAR STRING_DIALOG_TEST[];
+
+#define STRINGID(id) (0x##id + Globals.wStringTableOffset)
+
+#else /* RC_INVOKED */
+
+#define STRINGID(id) id
+
+#endif
+
+/* Stringtable index */
+#define IDS_LANGUAGE_ID      STRINGID(00)
+#define IDS_WINE_HELP        STRINGID(01)
+#define IDS_ERROR            STRINGID(02)
+#define IDS_WARNING          STRINGID(03)
+#define IDS_INFO             STRINGID(04)
+#define IDS_NOT_IMPLEMENTED  STRINGID(05)
+#define IDS_HLPFILE_ERROR_s  STRINGID(06)
+#define IDS_CONTENTS         STRINGID(07)
+#define IDS_SEARCH           STRINGID(08)
+#define IDS_BACK             STRINGID(09)
+#define IDS_HISTORY          STRINGID(0a)
+#define IDS_ALL_FILES        STRINGID(0b)
+#define IDS_HELP_FILES_HLP   STRINGID(0c)
+
+/* Menu `File' */
+#define WH_OPEN             11
+#define WH_PRINT            12
+#define WH_PRINTER_SETUP    13
+#define WH_EXIT             14
+
+/* Menu `Edit' */
+#define WH_COPY_DIALOG      21
+#define WH_ANNOTATE         22
+
+/* Menu `Bookmark' */
+#define WH_BOOKMARK_DEFINE  31
+
+/* Menu `Help' */
+#define WH_HELP_ON_HELP     41
+#define WH_HELP_ON_TOP      42
+#define WH_ABOUT            43
+#define WH_ABOUT_WINE       44
+
+/* Buttons */
+#define WH_FIRST_BUTTON     500
+
+/* Local Variables:    */
+/* c-file-style: "GNU" */
+/* End:                */
diff --git a/resources/TODO b/resources/TODO
index eff85ce..dbd7c26 100644
--- a/resources/TODO
+++ b/resources/TODO
@@ -46,9 +46,29 @@
 * English 
 * German
 * French
+* Italian
+* Korean
 ...to be continued......
 
 Thank you.
 
 Albrecht Kleine
 kleine@ak.sax.de
+
+**************************************************************
+1996, May, 2nd
+
+Subject ChooseFont
+
+Just like ChooseColor, please copy CHOSEFONT from sysres_EN.rc,
+and translate it to your language. It's okay for:
+
+* English
+* German
+.....
+
+Thank you.
+
+Albrecht Kleine
+kleine@ak.sax.de
+
diff --git a/resources/sysres_Cz.rc b/resources/sysres_Cz.rc
index e7129d6..9ddbc1c 100644
--- a/resources/sysres_Cz.rc
+++ b/resources/sysres_Cz.rc
@@ -27,14 +27,14 @@
         PUSHBUTTON "&Ne", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "O aplikaci %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "OK", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Text", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "OK", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Text", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
diff --git a/resources/sysres_Da.rc b/resources/sysres_Da.rc
index 9a7c700..99425c5 100644
--- a/resources/sysres_Da.rc
+++ b/resources/sysres_Da.rc
@@ -27,14 +27,14 @@
         PUSHBUTTON "&Nej", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Om %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "Ok", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Tekst", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "Ok", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Tekst", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
diff --git a/resources/sysres_De.rc b/resources/sysres_De.rc
index b20f6b8..13e5c1a 100644
--- a/resources/sysres_De.rc
+++ b/resources/sysres_De.rc
@@ -27,14 +27,14 @@
         PUSHBUTTON "&Nein", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Info über %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "OK", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Text", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "OK", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Text", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
@@ -132,15 +132,32 @@
 }
 
 
-CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+CHOOSE_FONT DIALOG DISCARDABLE  13, 54, 264, 147
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Font"
 FONT 8, "Helv"
 {
- LTEXT "Font:", 1088, 6, 6, 40, 9
- LTEXT "", 1089, 60, 6, 150, 9
- DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
- PUSHBUTTON "Abbrechen", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+    LTEXT           "Schrift&art:",1088 ,6,3,40,9
+    COMBOBOX        1136 ,6,13,94,54,  CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
+    LTEXT           "Schrift&stil:",1089 ,108,3,44,9
+    COMBOBOX        1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
+    LTEXT           "Schrift&größe:",1090,179,3,30,9
+    COMBOBOX        1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT
+    DEFPUSHBUTTON   "OK",IDOK,218,6,40,14,WS_GROUP
+    PUSHBUTTON      "Abbrechen",IDCANCEL,218,23,40,14,WS_GROUP
+    PUSHBUTTON      "&Zuweisen", 1026,218,40,40,14,WS_GROUP
+    PUSHBUTTON      "&Hilfe" , 1038,218,57,40,14,WS_GROUP
+    GROUPBOX        "Darstellung",1072,6,72,84,34,WS_GROUP
+    CHECKBOX	    "&Durchgestrichen", 1040, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP
+    CHECKBOX 	    "&Unterstrichen", 1041, 10,94,50,10, BS_AUTOCHECKBOX 
+    LTEXT           "&Farbe:", 1091 ,6,110,30,9
+    COMBOBOX        1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS |
+		    CBS_AUTOHSCROLL |  WS_BORDER | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "Muster",1073,98,72,160,49,WS_GROUP
+    CTEXT           "AaBbYyZz",1093,104,81,149,37,SS_NOPREFIX | WS_VISIBLE
 }
 
 
diff --git a/resources/sysres_En.rc b/resources/sysres_En.rc
index aba679a..ebe8dba 100644
--- a/resources/sysres_En.rc
+++ b/resources/sysres_En.rc
@@ -27,14 +27,14 @@
         PUSHBUTTON "&No", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "About %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "OK", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Text", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "OK", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Text", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
@@ -132,15 +132,32 @@
 }
 
 
-CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+CHOOSE_FONT DIALOG DISCARDABLE  13, 54, 264, 147
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Font"
 FONT 8, "Helv"
 {
- LTEXT "Font:", 1088, 6, 6, 40, 9
- LTEXT "", 1089, 60, 6, 150, 9
- DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
- PUSHBUTTON "Cancel", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+    LTEXT           "&Font:",1088 ,6,3,40,9
+    COMBOBOX        1136 ,6,13,94,54,  CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
+    LTEXT           "Font St&yle:",1089 ,108,3,44,9
+    COMBOBOX        1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
+    LTEXT           "&Size:",1090,179,3,30,9
+    COMBOBOX        1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT
+    DEFPUSHBUTTON   "OK",IDOK,218,6,40,14,WS_GROUP
+    PUSHBUTTON      "Cancel",IDCANCEL,218,23,40,14,WS_GROUP
+    PUSHBUTTON      "&Apply", 1026,218,40,40,14,WS_GROUP
+    PUSHBUTTON      "&Help" , 1038,218,57,40,14,WS_GROUP
+    GROUPBOX        "Effects",1072,6,72,84,34,WS_GROUP
+    CHECKBOX	    "Stri&keout", 1040, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP
+    CHECKBOX 	    "&Underline", 1041, 10,94,50,10, BS_AUTOCHECKBOX 
+    LTEXT           "&Color:", 1091 ,6,110,30,9
+    COMBOBOX        1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS |
+		    CBS_AUTOHSCROLL |  WS_BORDER | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "Sample",1073,98,72,160,49,WS_GROUP
+    CTEXT           "AaBbYyZz",1093,104,81,149,37,SS_NOPREFIX | WS_VISIBLE
 }
 
 
diff --git a/resources/sysres_Eo.rc b/resources/sysres_Eo.rc
index da223ee..bb3d7d0 100644
--- a/resources/sysres_Eo.rc
+++ b/resources/sysres_Eo.rc
@@ -27,14 +27,14 @@
         PUSHBUTTON "N&e", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Pri %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "Enorde", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Text", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "Enorde", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Text", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
diff --git a/resources/sysres_Es.rc b/resources/sysres_Es.rc
index 235fdd9..7380894 100644
--- a/resources/sysres_Es.rc
+++ b/resources/sysres_Es.rc
@@ -28,14 +28,14 @@
         PUSHBUTTON "&No", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Acerca de %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "Aceptar", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Text", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "Aceptar", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Text", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
diff --git a/resources/sysres_Fi.rc b/resources/sysres_Fi.rc
index 447f426..8b5ddc0 100644
--- a/resources/sysres_Fi.rc
+++ b/resources/sysres_Fi.rc
@@ -27,14 +27,14 @@
         PUSHBUTTON "&Ei", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Tietoja: %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "OK", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Teksti", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "OK", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Teksti", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
diff --git a/resources/sysres_Fr.rc b/resources/sysres_Fr.rc
index 3df4265..13843e1 100644
--- a/resources/sysres_Fr.rc
+++ b/resources/sysres_Fr.rc
@@ -28,14 +28,14 @@
         PUSHBUTTON "&Non", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 213, 179
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "A propos de %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "OK", 1, 86, 160, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 205, 120
- LTEXT "Text", 100, 11, 40, 190, 110, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "OK", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Text", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 185, 10, 18, 20
 }
 
diff --git a/resources/sysres_It.rc b/resources/sysres_It.rc
index 5fab00a..35a5626 100644
--- a/resources/sysres_It.rc
+++ b/resources/sysres_It.rc
@@ -27,14 +27,14 @@
         PUSHBUTTON "&No", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Informazioni su %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "OK", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Text", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "OK", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Text", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
diff --git a/resources/sysres_Ko.rc b/resources/sysres_Ko.rc
index b6588a5..24dfb4e 100644
--- a/resources/sysres_Ko.rc
+++ b/resources/sysres_Ko.rc
@@ -27,14 +27,14 @@
 	PUSHBUTTON "¾Æ´Ï¿À(&N)", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "%s¿¡ °üÇÏ¿©"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "½ÂÀÎ", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Text", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "½ÂÀÎ", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Text", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
diff --git a/resources/sysres_No.rc b/resources/sysres_No.rc
index f208f75..4192142 100644
--- a/resources/sysres_No.rc
+++ b/resources/sysres_No.rc
@@ -27,14 +27,14 @@
         PUSHBUTTON "&Nei", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
 END
 
-SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 270
 STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "Om %s"
 FONT 10, "System"
 {
- DEFPUSHBUTTON "OK", 1, 91, 180, 40, 14
- CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
- LTEXT "Tekst", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ DEFPUSHBUTTON "OK", 1, 91, 250, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+ LTEXT "Tekst", 100, 11, 40, 200, 200, SS_NOPREFIX | WS_GROUP
  ICON "", 1088, 195, 10, 18, 20
 }
 
diff --git a/tools/build.c b/tools/build.c
index ac2af32..8de8545 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -1057,11 +1057,13 @@
             printf( "/* %s.%d */\n", DLLName, i);
             printf( "\tpushw %%bp\n" );
             printf( "\tpushl $" PREFIX "%s\n", fdp->internal_name );
-            printf( "\tlcall $0x%04x, $" PREFIX "CallFrom16_%s_%s\n",
-                    WINE_CODE_SELECTOR,
+            /* FreeBSD does not understand lcall, so do it the hard way */
+            printf( "\t.byte 0x9a /*lcall*/\n" );
+            printf( "\t.long " PREFIX "CallFrom16_%s_%s\n",
                     (odp->type == TYPE_REGISTER) ? "regs" :
                     (odp->type == TYPE_PASCAL) ? "long" : "word",
                     fdp->arg_types );
+            printf( "\t.word 0x%04x\n", WINE_CODE_SELECTOR );
             printf( "\tnop\n" );
             printf( "\tnop\n\n" );
             odp->offset = code_offset;
@@ -1411,8 +1413,11 @@
 
     /* Save 16-bit ds and es */
 
-    printf( "\tmovw %%ds,-10(%%ebp)\n" );
-    printf( "\tmovw %%es,-6(%%ebp)\n" );
+    /* Stupid FreeBSD assembler doesn't know these either */
+    /* printf( "\tmovw %%ds,-10(%%ebp)\n" ); */
+    printf( "\t.byte 0x66,0x8c,0x5d,0xf6\n" );
+    /* printf( "\tmovw %%es,-6(%%ebp)\n" ); */
+    printf( "\t.byte 0x66,0x8c,0x45,0xfa\n" );
 
     /* Restore 32-bit ds and es */
 
diff --git a/win32/advapi.c b/win32/advapi.c
index c6fc137..4b37d55 100644
--- a/win32/advapi.c
+++ b/win32/advapi.c
@@ -16,7 +16,7 @@
  *           GetUserNameA   [ADVAPI32.67]
  */
 
-BOOL WINAPI GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
+BOOL GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
 {
   size_t len;
   char *name;
diff --git a/win32/cursoricon32.c b/win32/cursoricon32.c
index e5a102d..f5d8262 100644
--- a/win32/cursoricon32.c
+++ b/win32/cursoricon32.c
@@ -368,7 +368,7 @@
     sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
     sizeAnd = bmpAnd->bitmap.bmHeight * bmpAnd->bitmap.bmWidthBytes;
 
-    if (!(hRes = GlobalAlloc( GMEM_MOVEABLE,
+    if (!(hRes = GlobalAlloc16( GMEM_MOVEABLE,
                                 sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
     {
         DeleteObject( hXorBits );
@@ -379,7 +379,7 @@
     /* Make it owned by the module */
     if (hInstance) FarSetOwner( hRes, (WORD)(DWORD)GetExePtr(hInstance) );
 
-    info = (CURSORICONINFO *)GlobalLock( hRes );
+    info = (CURSORICONINFO *)GlobalLock16( hRes );
     info->ptHotSpot.x   = hotspot.x;
     info->ptHotSpot.y   = hotspot.y;
     info->nWidth        = bmpXor->bitmap.bmWidth;
@@ -394,7 +394,7 @@
     GetBitmapBits( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
     DeleteObject( hXorBits );
     DeleteObject( hAndBits );
-    GlobalUnlock( hRes );
+    GlobalUnlock16( hRes );
     return hRes;
 }
 
diff --git a/win32/environment.c b/win32/environment.c
index eff9050..57e6b00 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -23,7 +23,7 @@
 {
     static char buffer[256];
     char *cp;
-    PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() );
+    PDB *pdb = (PDB *)GlobalLock16( GetCurrentPDB() );
 
 #ifndef WINELIB
     strcpy(buffer, MODULE_GetModuleName( GetExePtr(GetCurrentTask()) ) );
diff --git a/win32/except.c b/win32/except.c
index 93de02f..e98ce4a 100644
--- a/win32/except.c
+++ b/win32/except.c
@@ -175,7 +175,7 @@
  *  fancy debugging information. It does nothing now!
  */
  
-DWORD WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers)
+DWORD UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers)
 {
    PEXCEPTION_RECORD pRecord;
    PCONTEXT          pContext;
@@ -206,7 +206,7 @@
  *
  */
   
-WINAPI LPTOP_LEVEL_EXCEPTION_FILTER 
+LPTOP_LEVEL_EXCEPTION_FILTER 
         SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER efilter)
 {  
    pTopExcHandler=efilter;
diff --git a/win32/file.c b/win32/file.c
index a14d6db..ab33853 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -38,7 +38,7 @@
  *           OpenFileMappingA             (KERNEL32.397)
  *
  */
-WINAPI HANDLE32 OpenFileMapping(DWORD access, BOOL inherit,const char *fname)
+HANDLE32 OpenFileMapping(DWORD access, BOOL inherit,const char *fname)
 {
 	return 0;
 }
@@ -47,7 +47,7 @@
  *
  */
 int TranslateProtectionFlags(DWORD);
-WINAPI HANDLE32 CreateFileMapping(HANDLE32 h,SECURITY_ATTRIBUTES *ats,
+HANDLE32 CreateFileMapping(HANDLE32 h,SECURITY_ATTRIBUTES *ats,
   DWORD pot,  DWORD sh,  DWORD hlow,  const char * lpName )
 {
     FILE_OBJECT *file_obj;
@@ -94,8 +94,8 @@
  *           MapViewOfFileEx                  (KERNEL32.386)
  *
  */
-WINAPI void *MapViewOfFileEx(HANDLE32 handle, DWORD access, DWORD offhi,
-                             DWORD offlo, DWORD size, DWORD st)
+void *MapViewOfFileEx(HANDLE32 handle, DWORD access, DWORD offhi,
+                      DWORD offlo, DWORD size, DWORD st)
 {
     if (!size) size = ((FILEMAP_OBJECT *)handle)->size;
     return mmap ((caddr_t)st, size, ((FILEMAP_OBJECT *)handle)->prot, 
@@ -108,8 +108,8 @@
  *           GetFileInformationByHandle       (KERNEL32.219)
  *
  */
-DWORD WINAPI GetFileInformationByHandle(FILE_OBJECT *hFile, 
-                                        BY_HANDLE_FILE_INFORMATION *lpfi)
+DWORD GetFileInformationByHandle(FILE_OBJECT *hFile, 
+                                 BY_HANDLE_FILE_INFORMATION *lpfi)
 {
   struct stat file_stat;
     int rc;
diff --git a/win32/init.c b/win32/init.c
index bf38b1d..0957822 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -80,7 +80,7 @@
 /* Freecell uses the result of GetModuleHandleA(0) as the hInstance in
 all calls to e.g. CreateWindowEx. */
     if (module == NULL) {
-	TDB *pTask = (TDB *)GlobalLock( GetCurrentTask() );
+	TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
 	hModule = pTask->hInstance;
     } else
 	hModule = GetModuleHandle(module);
diff --git a/win32/memory.c b/win32/memory.c
index 67455e4..349a368 100644
--- a/win32/memory.c
+++ b/win32/memory.c
@@ -316,3 +316,12 @@
 	/* FIXME: Should make check based on actual mappings, here */
 	return FALSE;
 }
+/******************************************************************
+ *                   IsBadWritePtr
+ */
+BOOL WIN32_IsBadCodePtr(void* ptr, unsigned int bytes)
+{
+	dprintf_global(stddeb,"IsBadCodePtr(%x,%x)\n",ptr,bytes);
+	/* FIXME: Should make check based on actual mappings, here */
+	return FALSE;
+}
diff --git a/win32/param32.c b/win32/param32.c
index a5323d2..b969648 100644
--- a/win32/param32.c
+++ b/win32/param32.c
@@ -28,7 +28,7 @@
 	}
 }
 
-BOOL WIN32_GetTextExtentPointA(HDC hdc, LPCTSTR str, int length, SIZE32* lpsize)
+BOOL WIN32_GetTextExtentPointA(HDC hdc, LPCSTR str, int length, SIZE32* lpsize)
 
 {
         SIZE s;
@@ -40,7 +40,7 @@
         return retval;
 }
 
-ATOM WIN32_GlobalAddAtomA(LPCTSTR str)
+ATOM WIN32_GlobalAddAtomA(LPCSTR str)
 {
     char buffer[256];  /* 16-bit atoms are limited to 255 anyway */
     lstrcpyn( buffer, str, sizeof(buffer) );
diff --git a/win32/process.c b/win32/process.c
index 2901524..4ed4c7e 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -14,6 +14,8 @@
 #include "stddebug.h"
 #include "debug.h"
 
+static HANDLE32 ProcessHeap = 0;  /* FIXME: should be in process database */
+
 /***********************************************************************
  *           ExitProcess   (KERNEL32.100)
  */
@@ -26,7 +28,7 @@
 /***********************************************************************
  *           CreateMutexA    (KERNEL32.52)
  */
-WINAPI HANDLE32 CreateMutexA (SECURITY_ATTRIBUTES *sa, BOOL on, const char *a)
+HANDLE32 CreateMutexA (SECURITY_ATTRIBUTES *sa, BOOL on, const char *a)
 {
 	return 0;
 }
@@ -34,7 +36,7 @@
 /***********************************************************************
  *           ReleaseMutex    (KERNEL32.435)
  */
-WINAPI BOOL ReleaseMutex (HANDLE32 h)
+BOOL ReleaseMutex (HANDLE32 h)
 {
 	return 0;
 }
@@ -42,7 +44,7 @@
 /***********************************************************************
  *           CreateEventA    (KERNEL32.43)
  */
-WINAPI HANDLE32 CreateEventA (SECURITY_ATTRIBUTES *sa, BOOL au, BOOL on, const char
+HANDLE32 CreateEventA (SECURITY_ATTRIBUTES *sa, BOOL au, BOOL on, const char
 *name)
 {
 	return 0;
@@ -50,28 +52,28 @@
 /***********************************************************************
  *           SetEvent    (KERNEL32.487)
  */
-WINAPI BOOL SetEvent (HANDLE32 h)
+BOOL SetEvent (HANDLE32 h)
 {
 	return 0;
 }
 /***********************************************************************
  *           ResetEvent    (KERNEL32.439)
  */
-WINAPI BOOL ResetEvent (HANDLE32 h)
+BOOL ResetEvent (HANDLE32 h)
 {
 	return 0;
 }
 /***********************************************************************
  *           WaitForSingleObject    (KERNEL32.561)
  */
-DWORD WINAPI WaitForSingleObject(HANDLE32 h, DWORD a)
+DWORD WaitForSingleObject(HANDLE32 h, DWORD a)
 {
 	return 0;
 }
 /***********************************************************************
  *           DuplicateHandle    (KERNEL32.78)
  */
-BOOL WINAPI DuplicateHandle(HANDLE32 a, HANDLE32 b, HANDLE32 c, HANDLE32 * d, DWORD e, BOOL f, DWORD g)
+BOOL DuplicateHandle(HANDLE32 a, HANDLE32 b, HANDLE32 c, HANDLE32 * d, DWORD e, BOOL f, DWORD g)
 {
 	*d = b;
 	return 1;
@@ -79,17 +81,26 @@
 /***********************************************************************
  *           GetCurrentProcess    (KERNEL32.198)
  */
-HANDLE32 WINAPI GetCurrentProcess(void)
+HANDLE32 GetCurrentProcess(void)
 {
 	return 0;
 }
 
 /***********************************************************************
+ *           GetProcessHeap    (KERNEL32.259)
+ */
+HANDLE32 GetProcessHeap(void)
+{
+    if (!ProcessHeap) ProcessHeap = HeapCreate( 0, 0x10000, 0 );
+    return ProcessHeap;
+}
+
+/***********************************************************************
  *           LoadLibraryA         (KERNEL32.365)
  * copied from LoadLibrary
  * This does not currently support built-in libraries
  */
-HANDLE32 WINAPI LoadLibraryA(char *libname)
+HANDLE32 LoadLibraryA(char *libname)
 {
 	HANDLE handle;
 	dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
@@ -113,7 +124,7 @@
 /***********************************************************************
  *          WIN32_GetProcAddress
  */
-void* WINAPI WIN32_GetProcAddress(HANDLE32 hModule, char* function)
+void* WIN32_GetProcAddress(HANDLE32 hModule, char* function)
 {
 	dprintf_module( stddeb, "WIN32_GetProcAddress(%08x,%s)\n",
 		hModule, function);
diff --git a/win32/resource.c b/win32/resource.c
index dfe5537..74ff0af 100644
--- a/win32/resource.c
+++ b/win32/resource.c
@@ -221,9 +221,9 @@
 
     lp = (BYTE *)LockResource32(rsc_mem);
     n = SizeofResource( instance, hRsrc ) / sizeof(ACCELENTRY);
-    hAccel = GlobalAlloc(GMEM_MOVEABLE, 
+    hAccel = GlobalAlloc16(GMEM_MOVEABLE, 
     	sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
-    lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
+    lpAccelTbl = (LPACCELHEADER)GlobalLock16(hAccel);
     lpAccelTbl->wCount = 0;
     for (i = 0; i < n; i++) {
 	lpAccelTbl->tbl[i].type = *(lp++);
@@ -238,7 +238,7 @@
 		lpAccelTbl->tbl[i].type);
 	lpAccelTbl->wCount++;
  	}
-    GlobalUnlock(hAccel);
+    GlobalUnlock16(hAccel);
     FreeResource( rsc_mem );
     return hAccel;
 #else
@@ -249,9 +249,15 @@
 
 HANDLE32 WIN32_LoadAcceleratorsA(HINSTANCE instance, LPCSTR lpTableName)
 {
-	LPWSTR uni=STRING32_DupAnsiToUni(lpTableName);
-	HANDLE32 result=WIN32_LoadAcceleratorsW(instance,uni);
-	free(uni);
+	LPWSTR		uni;
+	HANDLE32	result;
+	if (HIWORD(lpTableName))
+		uni=STRING32_DupAnsiToUni(lpTableName);
+	else
+		uni=(LPWSTR)lpTableName;
+	result=WIN32_LoadAcceleratorsW(instance,uni);
+	if (HIWORD(uni))
+		free(uni);
 	return result;
 }
 
@@ -317,13 +323,13 @@
     return retval;
 }
 
-HICON LoadIconW32(HINSTANCE hisnt, LPCTSTR lpszIcon)
+HICON LoadIconW32(HINSTANCE hisnt, LPCWSTR lpszIcon)
 
 {
 	return LoadIcon(0, IDI_APPLICATION);
 }
 
-HICON LoadIconA32(HINSTANCE hinst, LPCTSTR lpszIcon)
+HICON LoadIconA32(HINSTANCE hinst, LPCSTR lpszIcon)
 
 {
 	return LoadIconW32(hinst, lpszIcon);
diff --git a/win32/thread.c b/win32/thread.c
index 5aa0ad5..b538002 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -34,7 +34,7 @@
 /***********************************************************************
  *           GetCurrentThread    (KERNEL32.200)
  */
-HANDLE WINAPI GetCurrentThread(void)
+HANDLE GetCurrentThread(void)
 {
 	return 0;
 }
@@ -42,12 +42,12 @@
 /**********************************************************************
  *          Critical Sections are currently ignored
  */
-void WINAPI InitializeCriticalSection(CRITICAL_SECTION *lpCrit)
+void InitializeCriticalSection(CRITICAL_SECTION *lpCrit)
 {
 	memset(lpCrit,0,sizeof(CRITICAL_SECTION));
 }
 
-void WINAPI EnterCriticalSection(CRITICAL_SECTION* lpCrit)
+void EnterCriticalSection(CRITICAL_SECTION* lpCrit)
 {
     if (lpCrit->LockCount)
         fprintf( stderr, "Error: re-entering critical section %08lx\n",
@@ -55,7 +55,7 @@
     lpCrit->LockCount++;
 }
 
-void WINAPI LeaveCriticalSection(CRITICAL_SECTION* lpCrit)
+void LeaveCriticalSection(CRITICAL_SECTION* lpCrit)
 {
     if (!lpCrit->LockCount)
         fprintf( stderr, "Error: leaving critical section %08lx again\n",
@@ -63,7 +63,7 @@
     lpCrit->LockCount--;
 }
 
-void WINAPI DeleteCriticalSection(CRITICAL_SECTION* lpCrit)
+void DeleteCriticalSection(CRITICAL_SECTION* lpCrit)
 {
 	return;
 }
@@ -74,7 +74,7 @@
 static LPVOID* Tls=0;
 static int TlsCount=0;
 
-DWORD WINAPI TlsAlloc()
+DWORD TlsAlloc()
 {
 	if(!Tls){
 		TlsCount++;
diff --git a/win32/user32.c b/win32/user32.c
index b9a9db5..1a6fa92 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -26,53 +26,6 @@
 #include "stddebug.h"
 
 /***********************************************************************
- *           RegisterClassA      (USER32.426)
- */
-ATOM USER32_RegisterClassA(WNDCLASSA* wndclass)
-{
-	WNDCLASS copy;
-	HANDLE classh = 0, menuh = 0;
-	SEGPTR classsegp, menusegp;
-	char *classbuf, *menubuf;
-
-	ATOM retval;
-	copy.style=wndclass->style;
-	ALIAS_RegisterAlias(0,0,(DWORD)wndclass->lpfnWndProc);
-	copy.lpfnWndProc=wndclass->lpfnWndProc;
-	copy.cbClsExtra=wndclass->cbClsExtra;
-	copy.cbWndExtra=wndclass->cbWndExtra;
-	copy.hInstance=(HINSTANCE)wndclass->hInstance;
-	copy.hIcon=(HICON)wndclass->hIcon;
-	copy.hCursor=(HCURSOR)wndclass->hCursor;
-	copy.hbrBackground=(HBRUSH)wndclass->hbrBackground;
-
-	/* FIXME: There has to be a better way of doing this - but neither
-	malloc nor alloca will work */
-
-	if(wndclass->lpszMenuName)
-	{
-		menuh = GlobalAlloc(0, strlen(wndclass->lpszMenuName)+1);
-		menusegp = WIN16_GlobalLock(menuh);
-		menubuf = PTR_SEG_TO_LIN(menusegp);
-		strcpy( menubuf, wndclass->lpszMenuName);
-		copy.lpszMenuName=menusegp;
-	}else
-		copy.lpszMenuName=0;
-	if(wndclass->lpszClassName)
-	{
-		classh = GlobalAlloc(0, strlen(wndclass->lpszClassName)+1);
-		classsegp = WIN16_GlobalLock(classh);
-		classbuf = PTR_SEG_TO_LIN(classsegp);
-		strcpy( classbuf, wndclass->lpszClassName);
-		copy.lpszClassName=classsegp;
-	}
-	retval = RegisterClass(&copy);
-	GlobalFree(menuh);
-	GlobalFree(classh);
-	return retval;
-}
-
-/***********************************************************************
  *          GetMessageA          (USER32.269)
  */
 BOOL USER32_GetMessageA(MSG32* lpmsg,DWORD hwnd,DWORD min,DWORD max)
@@ -145,23 +98,24 @@
 }
 
 /***********************************************************************
- *         CreateWindowExA        (USER32.82)
+ *         CreateWindowEx32A        (USER32.82)
  */
-DWORD USER32_CreateWindowExA(long flags,char* class,char *title,
-	long style,int x,int y,int width,int height,DWORD parent,DWORD menu,
-	DWORD instance,DWORD param)
+HWND32 CreateWindowEx32A( DWORD flags, LPCSTR class, LPCSTR title,
+                          DWORD style, INT32 x, INT32 y, INT32 width,
+                          INT32 height, HWND32 parent, HMENU32 menu,
+                          HINSTANCE32 instance, LPVOID param )
 {
-    DWORD retval;
+    HWND32 retval;
     HANDLE classh=0, titleh=0;
     SEGPTR classsegp=0, titlesegp=0;
     char *classbuf, *titlebuf;
 	int usec,uset;
 
     /*Have to translate CW_USEDEFAULT */
-    if(x==CW_USEDEFAULT32)x=CW_USEDEFAULT;
-    if(y==CW_USEDEFAULT32)y=CW_USEDEFAULT;
-    if(width==CW_USEDEFAULT32)width=CW_USEDEFAULT;
-    if(height==CW_USEDEFAULT32)height=CW_USEDEFAULT;
+    if(x==CW_USEDEFAULT32)x=CW_USEDEFAULT16;
+    if(y==CW_USEDEFAULT32)y=CW_USEDEFAULT16;
+    if(width==CW_USEDEFAULT32)width=CW_USEDEFAULT16;
+    if(height==CW_USEDEFAULT32)height=CW_USEDEFAULT16;
 
     /* FIXME: There has to be a better way of doing this - but neither
     malloc nor alloca will work */
@@ -169,39 +123,40 @@
 	uset = HIWORD(title);
 
 	if(usec){
-    	classh = GlobalAlloc(0, strlen(class)+1);
-    	classsegp = WIN16_GlobalLock(classh);
+    	classh = GlobalAlloc16(0, strlen(class)+1);
+    	classsegp = WIN16_GlobalLock16(classh);
     	classbuf = PTR_SEG_TO_LIN(classsegp);
     	strcpy( classbuf, class );
 	}
 	if(uset){
-    	titleh = GlobalAlloc(0, strlen(title)+1);
-    	titlesegp = WIN16_GlobalLock(titleh);
+    	titleh = GlobalAlloc16(0, strlen(title)+1);
+    	titlesegp = WIN16_GlobalLock16(titleh);
     	titlebuf = PTR_SEG_TO_LIN(titlesegp);
     	strcpy( titlebuf, title );
 	}
     
-    retval = (DWORD) CreateWindowEx(flags,(usec ? classsegp : (SEGPTR)class),
+    retval = (HWND32)CreateWindowEx16(flags,(usec ? classsegp : (SEGPTR)class),
 				  (uset ? titlesegp : (SEGPTR)title),style,x,y,width,height,
 				  (HWND)parent,(HMENU)menu,(HINSTANCE)instance,
 				  (DWORD)param);
-    if(usec)GlobalFree(classh);
-    if(uset)GlobalFree(titleh);
+    if(usec)GlobalFree16(classh);
+    if(uset)GlobalFree16(titleh);
     return retval;
 }
 
-DWORD USER32_CreateWindowExW(long flags,LPCWSTR class,LPCWSTR title,
-	long style,int x,int y,int width,int height,DWORD parent,DWORD menu,
-	DWORD instance,DWORD param)
+HWND32 CreateWindowEx32W( DWORD flags, LPCWSTR class, LPCWSTR title,
+                          DWORD style, INT32 x, INT32 y, INT32 width,
+                          INT32 height, HWND32 parent, HMENU32 menu,
+                          HINSTANCE32 instance, LPVOID param )
 {
-	HWND hwnd;
+        HWND32 hwnd;
 	LPSTR c,t;
 	int usec,uset;
 	usec=HIWORD(class);
 	uset=HIWORD(title);
 	c = usec ? STRING32_DupUniToAnsi(class) : (LPSTR)class;
 	t = uset ? STRING32_DupUniToAnsi(title) : (LPSTR)title;
-	hwnd=USER32_CreateWindowExA(flags,c,t,style,x,y,width,height,parent,menu,
+	hwnd=CreateWindowEx32A(flags,c,t,style,x,y,width,height,parent,menu,
 		instance,param);
 	if(usec)free(c);
 	if(uset)free(t);
@@ -328,8 +283,8 @@
 	rect.right -= rect.left;
 	rect.bottom -= rect.top;
 
-	if(dlgTempl->x == CW_USEDEFAULT)
-		rect.left = rect.top = CW_USEDEFAULT;
+	if(dlgTempl->x == CW_USEDEFAULT16)
+		rect.left = rect.top = CW_USEDEFAULT16;
 	else{
 		rect.left += dlgTempl->x * xUnit / 4;
 		rect.top += dlgTempl->y * yUnit / 8;
@@ -338,7 +293,7 @@
 	}
 
 	/* FIXME: Here is the place to consider A */
-	hwnd = USER32_CreateWindowExW(exStyle, (LPWSTR)ClassName, (LPWSTR)szCaption,
+	hwnd = CreateWindowEx32W(exStyle, (LPWSTR)ClassName, (LPWSTR)szCaption,
 		dlgTempl->style & ~WS_VISIBLE, 
 		rect.left, rect.top, rect.right, rect.bottom,
 		hWndParent, hMenu, hInst, 0);
@@ -407,7 +362,7 @@
 			fprintf(stderr,"having data\n");
 		}
 		ptr++;
-		hwndCtrl = USER32_CreateWindowExW(WS_EX_NOPARENTNOTIFY,
+		hwndCtrl = CreateWindowEx32W(WS_EX_NOPARENTNOTIFY,
 			(LPWSTR)ClassId, (LPWSTR)Text,
 			dlgitem->style | WS_CHILD,
 			dlgitem->x * xUnit / 4,
diff --git a/windows/Makefile.in b/windows/Makefile.in
index 0bb6799..10d6206 100644
--- a/windows/Makefile.in
+++ b/windows/Makefile.in
@@ -26,7 +26,6 @@
 	syscolor.c \
 	sysmetrics.c \
 	timer.c \
-	utility.c \
 	win.c \
 	winpos.c
 
diff --git a/windows/class.c b/windows/class.c
index 1a97140..c05eb39 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -8,6 +8,7 @@
 #include <stdio.h>
 #include <string.h>
 #include "class.h"
+#include "heap.h"
 #include "user.h"
 #include "win.h"
 #include "dce.h"
@@ -31,8 +32,7 @@
     char className[80];
     int i;
 
-    if (((CLASS *)USER_HEAP_LIN_ADDR(ptr->self) != ptr) ||
-        (ptr->wMagic != CLASS_MAGIC))
+    if (ptr->magic != CLASS_MAGIC)
     {
         fprintf( stderr, "%p is not a class\n", ptr );
         return;
@@ -42,17 +42,17 @@
 
     fprintf( stderr, "Class %p:\n", ptr );
     fprintf( stderr,
-             "next=%p  name=%04x '%s'  style=%04x  wndProc=%08lx\n"
+             "next=%p  name=%04x '%s'  style=%08x  wndProc=%08lx\n"
              "inst=%04x  hdce=%04x  icon=%04x  cursor=%04x  bkgnd=%04x\n"
              "clsExtra=%d  winExtra=%d  #windows=%d\n",
-             ptr->next, ptr->atomName, className, ptr->wc.style,
-             (DWORD)ptr->wc.lpfnWndProc, ptr->wc.hInstance, ptr->hdce,
-             ptr->wc.hIcon, ptr->wc.hCursor, ptr->wc.hbrBackground,
-             ptr->wc.cbClsExtra, ptr->wc.cbWndExtra, ptr->cWindows );
-    if (ptr->wc.cbClsExtra)
+             ptr->next, ptr->atomName, className, ptr->style,
+             (DWORD)ptr->lpfnWndProc, ptr->hInstance, ptr->hdce,
+             ptr->hIcon, ptr->hCursor, ptr->hbrBackground,
+             ptr->cbClsExtra, ptr->cbWndExtra, ptr->cWindows );
+    if (ptr->cbClsExtra)
     {
         fprintf( stderr, "extra bytes:" );
-        for (i = 0; i < ptr->wc.cbClsExtra; i++)
+        for (i = 0; i < ptr->cbClsExtra; i++)
             fprintf( stderr, " %02x", *((BYTE *)ptr->wExtra+i) );
         fprintf( stderr, "\n" );
     }
@@ -70,12 +70,12 @@
     CLASS *ptr;
     char className[80];
 
-    fprintf( stderr, " Class   Name                Style WndProc\n" );
+    fprintf( stderr, " Class   Name                 Style   WndProc\n" );
     for (ptr = firstClass; ptr; ptr = ptr->next)
     {
         GlobalGetAtomName( ptr->atomName, className, sizeof(className) );
-        fprintf( stderr, "%08lx %-20.20s %04x %08lx\n", (DWORD)ptr, className,
-                 ptr->wc.style, (DWORD)ptr->wc.lpfnWndProc );
+        fprintf( stderr, "%08lx %-20.20s %08x %08lx\n", (DWORD)ptr, className,
+                 ptr->style, (DWORD)ptr->lpfnWndProc );
     }
     fprintf( stderr, "\n" );
 }
@@ -104,11 +104,11 @@
     /* Delete the class */
 
     if (classPtr->hdce) DCE_FreeDCE( classPtr->hdce );
-    if (classPtr->wc.hbrBackground) DeleteObject( classPtr->wc.hbrBackground );
+    if (classPtr->hbrBackground) DeleteObject( classPtr->hbrBackground );
     GlobalDeleteAtom( classPtr->atomName );
-    if (HIWORD(classPtr->wc.lpszMenuName))
-	USER_HEAP_FREE( (HANDLE)classPtr->wc.lpszMenuName );
-    USER_HEAP_FREE( classPtr->self );
+    if (HIWORD(classPtr->lpszMenuName))
+	USER_HEAP_FREE( (HANDLE)classPtr->lpszMenuName );
+    HeapFree( SystemHeap, 0, classPtr );
 }
 
 
@@ -122,12 +122,43 @@
     for (ptr = firstClass; ptr; ptr = next)
     {
         next = ptr->next;
-	if (ptr->wc.hInstance == hModule) CLASS_FreeClass( ptr );
+	if (ptr->hInstance == hModule) CLASS_FreeClass( ptr );
     }
 }
 
 
 /***********************************************************************
+ *           CLASS_FindClassByAtom
+ *
+ * Return a pointer to the class.
+ */
+CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE16 hinstance )
+{
+    CLASS * class;
+
+      /* First search task-specific classes */
+
+    for (class = firstClass; (class); class = class->next)
+    {
+        if (class->style & CS_GLOBALCLASS) continue;
+        if ((class->atomName == atom) && 
+            ((hinstance==(HINSTANCE16)0xffff) ||
+             (hinstance == class->hInstance))) return class;
+    }
+    
+      /* Then search global classes */
+
+    for (class = firstClass; (class); class = class->next)
+    {
+        if (!(class->style & CS_GLOBALCLASS)) continue;
+        if (class->atomName == atom) return class;
+    }
+
+    return 0;
+}
+
+
+/***********************************************************************
  *           CLASS_FindClassByName
  *
  * Return a pointer to the class.
@@ -135,93 +166,76 @@
 CLASS *CLASS_FindClassByName( SEGPTR name, HINSTANCE hinstance )
 {
     ATOM atom;
-    CLASS * class;
 
     if (!(atom = GlobalFindAtom( name ))) return 0;
-
-      /* First search task-specific classes */
-
-    for (class = firstClass; (class); class = class->next)
-    {
-        if (class->wc.style & CS_GLOBALCLASS) continue;
-        if ((class->atomName == atom) && 
-            ((hinstance==(HINSTANCE)0xffff) ||
-             (hinstance == class->wc.hInstance))) return class;
-    }
-    
-      /* Then search global classes */
-
-    for (class = firstClass; (class); class = class->next)
-    {
-        if (!(class->wc.style & CS_GLOBALCLASS)) continue;
-        if (class->atomName == atom) return class;
-    }
-
-    return 0;
+    return CLASS_FindClassByAtom( atom, hinstance );
 }
 
 
 /***********************************************************************
- *           RegisterClass    (USER.57)
+ *           RegisterClass16    (USER.57)
  */
-ATOM RegisterClass( LPWNDCLASS class )
+ATOM RegisterClass16( const WNDCLASS16 *wc )
 {
     CLASS * newClass, * prevClass;
-    HCLASS handle;
+    HANDLE16 hInstance;
     int classExtra;
 
     dprintf_class( stddeb, "RegisterClass: wndproc=%08lx hinst=%04x name='%s' background %04x\n",
-                 (DWORD)class->lpfnWndProc, class->hInstance,
-                 HIWORD(class->lpszClassName) ?
-                  (char *)PTR_SEG_TO_LIN(class->lpszClassName) : "(int)",
-                 class->hbrBackground );
+                 (DWORD)wc->lpfnWndProc, wc->hInstance,
+                 HIWORD(wc->lpszClassName) ?
+                  (char *)PTR_SEG_TO_LIN(wc->lpszClassName) : "(int)",
+                 wc->hbrBackground );
     dprintf_class(stddeb,"               style=%04x clsExtra=%d winExtra=%d\n",
-                  class->style, class->cbClsExtra, class->cbWndExtra );
+                  wc->style, wc->cbClsExtra, wc->cbWndExtra );
     
       /* Window classes are owned by modules, not instances */
-    class->hInstance = GetExePtr( class->hInstance );
+    hInstance = GetExePtr( wc->hInstance );
     
       /* Check if a class with this name already exists */
-    prevClass = CLASS_FindClassByName( class->lpszClassName, class->hInstance);
+    prevClass = CLASS_FindClassByName( wc->lpszClassName, hInstance );
     if (prevClass)
     {
 	  /* Class can be created only if it is local and */
 	  /* if the class with the same name is global.   */
 
-	if (class->style & CS_GLOBALCLASS) return 0;
-	if (!(prevClass->wc.style & CS_GLOBALCLASS)) return 0;
+	if (wc->style & CS_GLOBALCLASS) return 0;
+	if (!(prevClass->style & CS_GLOBALCLASS)) return 0;
     }
 
       /* Create class */
 
-    classExtra = (class->cbClsExtra < 0) ? 0 : class->cbClsExtra;
-    handle = USER_HEAP_ALLOC( sizeof(CLASS) + classExtra );
-    if (!handle) return 0;
-    newClass = (CLASS *) USER_HEAP_LIN_ADDR( handle );
-    newClass->self          = handle;
+    classExtra = (wc->cbClsExtra < 0) ? 0 : wc->cbClsExtra;
+    newClass = (CLASS *)HeapAlloc( SystemHeap, 0, sizeof(CLASS) + classExtra );
+    if (!newClass) return 0;
     newClass->next          = firstClass;
-    newClass->wMagic        = CLASS_MAGIC;
+    newClass->magic         = CLASS_MAGIC;
     newClass->cWindows      = 0;  
-    newClass->wc            = *class;
-    newClass->wc.cbWndExtra = (class->cbWndExtra < 0) ? 0 : class->cbWndExtra;
-    newClass->wc.cbClsExtra = classExtra;
+    newClass->style         = wc->style;
+    newClass->lpfnWndProc   = wc->lpfnWndProc;
+    newClass->cbWndExtra    = (wc->cbWndExtra < 0) ? 0 : wc->cbWndExtra;
+    newClass->cbClsExtra    = classExtra;
+    newClass->lpszMenuName  = wc->lpszMenuName;
+    newClass->hInstance     = hInstance;
+    newClass->hIcon         = wc->hIcon;
+    newClass->hCursor       = wc->hCursor;
+    newClass->hbrBackground = wc->hbrBackground;
 
-    newClass->atomName = GlobalAddAtom( class->lpszClassName );
-    newClass->wc.lpszClassName = 0;
+    newClass->atomName = GlobalAddAtom( wc->lpszClassName );
 
-    if (newClass->wc.style & CS_CLASSDC)
+    if (newClass->style & CS_CLASSDC)
 	newClass->hdce = DCE_AllocDCE( DCE_CLASS_DC );
     else newClass->hdce = 0;
 
       /* Make a copy of the menu name (only if it is a string) */
 
-    if (HIWORD(class->lpszMenuName))
+    if (HIWORD(wc->lpszMenuName))
     {
-        char *menuname = PTR_SEG_TO_LIN( class->lpszMenuName );
+        char *menuname = PTR_SEG_TO_LIN( wc->lpszMenuName );
 	HANDLE hname = USER_HEAP_ALLOC( strlen(menuname)+1 );
 	if (hname)
 	{
-	    newClass->wc.lpszMenuName = (SEGPTR)USER_HEAP_SEG_ADDR( hname );
+	    newClass->lpszMenuName = (SEGPTR)USER_HEAP_SEG_ADDR( hname );
 	    strcpy( USER_HEAP_LIN_ADDR( hname ), menuname );
 	}
     }
@@ -233,9 +247,57 @@
 
 
 /***********************************************************************
- *           UnregisterClass    (USER.403)
+ *           RegisterClass32A      (USER32.426)
  */
-BOOL UnregisterClass( SEGPTR className, HANDLE hinstance )
+ATOM RegisterClass32A( const WNDCLASS32A* wc )
+{
+    WNDCLASS16 copy;
+    HANDLE classh = 0, menuh = 0;
+    SEGPTR classsegp, menusegp;
+    char *classbuf, *menubuf;
+
+    ATOM retval;
+    copy.style=wc->style;
+    ALIAS_RegisterAlias(0,0,(DWORD)wc->lpfnWndProc);
+    copy.lpfnWndProc=wc->lpfnWndProc;
+    copy.cbClsExtra=wc->cbClsExtra;
+    copy.cbWndExtra=wc->cbWndExtra;
+    copy.hInstance=(HINSTANCE)wc->hInstance;
+    copy.hIcon=(HICON)wc->hIcon;
+    copy.hCursor=(HCURSOR)wc->hCursor;
+    copy.hbrBackground=(HBRUSH)wc->hbrBackground;
+    
+    /* FIXME: There has to be a better way of doing this - but neither
+       malloc nor alloca will work */
+
+    if(wc->lpszMenuName)
+    {
+        menuh = GlobalAlloc16(0, strlen(wc->lpszMenuName)+1);
+        menusegp = WIN16_GlobalLock16(menuh);
+        menubuf = PTR_SEG_TO_LIN(menusegp);
+        strcpy( menubuf, wc->lpszMenuName);
+        copy.lpszMenuName=menusegp;
+    }else
+        copy.lpszMenuName=0;
+    if(wc->lpszClassName)
+    {
+        classh = GlobalAlloc16(0, strlen(wc->lpszClassName)+1);
+        classsegp = WIN16_GlobalLock16(classh);
+        classbuf = PTR_SEG_TO_LIN(classsegp);
+        strcpy( classbuf, wc->lpszClassName);
+        copy.lpszClassName=classsegp;
+    }
+    retval = RegisterClass16(&copy);
+    GlobalFree16(menuh);
+    GlobalFree16(classh);
+    return retval;
+}
+
+
+/***********************************************************************
+ *           UnregisterClass16    (USER.403)
+ */
+BOOL UnregisterClass16( SEGPTR className, HINSTANCE16 hinstance )
 {
     CLASS *classPtr;
 
@@ -244,7 +306,7 @@
       /* Check if we can remove this class */
     if (!(classPtr = CLASS_FindClassByName( className, hinstance )))
         return FALSE;
-    if ((classPtr->wc.hInstance != hinstance) || (classPtr->cWindows > 0))
+    if ((classPtr->hInstance != hinstance) || (classPtr->cWindows > 0))
 	return FALSE;
     CLASS_FreeClass( classPtr );
     return TRUE;
@@ -263,14 +325,15 @@
         return *(WORD *)(((char *)wndPtr->class->wExtra) + offset);
     switch(offset)
     {
-        case GCW_HBRBACKGROUND: return wndPtr->class->wc.hbrBackground;
-        case GCW_HCURSOR:       return wndPtr->class->wc.hCursor;
-        case GCW_HICON:         return wndPtr->class->wc.hIcon;
-        case GCW_HMODULE:       return wndPtr->class->wc.hInstance;
-        case GCW_CBWNDEXTRA:    return wndPtr->class->wc.cbWndExtra;
-        case GCW_CBCLSEXTRA:    return wndPtr->class->wc.cbClsExtra;
-        case GCW_STYLE:         return wndPtr->class->wc.style;
+        case GCW_HBRBACKGROUND: return wndPtr->class->hbrBackground;
+        case GCW_HCURSOR:       return wndPtr->class->hCursor;
+        case GCW_HICON:         return wndPtr->class->hIcon;
+        case GCW_HMODULE:       return wndPtr->class->hInstance;
         case GCW_ATOM:          return wndPtr->class->atomName;
+        case GCW_STYLE:
+        case GCW_CBWNDEXTRA:
+        case GCW_CBCLSEXTRA:
+            return (WORD)GetClassLong( hwnd, offset );
     }
     fprintf(stderr, "Warning: invalid offset %d for GetClassWord()\n", offset);
     return 0;
@@ -289,14 +352,15 @@
     if (offset >= 0) ptr = (WORD *)(((char *)wndPtr->class->wExtra) + offset);
     else switch(offset)
     {
-        case GCW_HBRBACKGROUND: ptr = &wndPtr->class->wc.hbrBackground; break;
-        case GCW_HCURSOR:       ptr = &wndPtr->class->wc.hCursor; break;
-        case GCW_HICON:         ptr = &wndPtr->class->wc.hIcon; break;
-        case GCW_HMODULE:       ptr = &wndPtr->class->wc.hInstance; break;
-        case GCW_CBWNDEXTRA:    ptr = &wndPtr->class->wc.cbWndExtra; break;
-        case GCW_CBCLSEXTRA:    ptr = &wndPtr->class->wc.cbClsExtra; break;
-        case GCW_STYLE:         ptr = &wndPtr->class->wc.style; break;
+        case GCW_HBRBACKGROUND: ptr = &wndPtr->class->hbrBackground; break;
+        case GCW_HCURSOR:       ptr = &wndPtr->class->hCursor; break;
+        case GCW_HICON:         ptr = &wndPtr->class->hIcon; break;
+        case GCW_HMODULE:       ptr = &wndPtr->class->hInstance; break;
         case GCW_ATOM:          ptr = &wndPtr->class->atomName; break;
+        case GCW_STYLE:
+        case GCW_CBWNDEXTRA:
+        case GCW_CBCLSEXTRA:
+            return (WORD)SetClassLong( hwnd, offset, (LONG)newval );
         default:
             fprintf( stderr, "Warning: invalid offset %d for SetClassWord()\n",
                      offset);
@@ -320,8 +384,11 @@
         return *(WORD *)(((char *)wndPtr->class->wExtra) + offset);
     switch(offset)
     {
-        case GCL_MENUNAME: return (LONG)wndPtr->class->wc.lpszMenuName;
-        case GCL_WNDPROC:  return (LONG)wndPtr->class->wc.lpfnWndProc;
+        case GCL_STYLE:      return (LONG)wndPtr->class->style;
+        case GCL_CBWNDEXTRA: return (LONG)wndPtr->class->cbWndExtra;
+        case GCL_CBCLSEXTRA: return (LONG)wndPtr->class->cbClsExtra;
+        case GCL_MENUNAME:   return (LONG)wndPtr->class->lpszMenuName;
+        case GCL_WNDPROC:    return (LONG)wndPtr->class->lpfnWndProc;
     }
     fprintf(stderr, "Warning: invalid offset %d for GetClassLong()\n", offset);
     return 0;
@@ -340,8 +407,11 @@
     if (offset >= 0) ptr = (LONG *)(((char *)wndPtr->class->wExtra) + offset);
     else switch(offset)
     {
-        case GCL_MENUNAME: ptr = (LONG*)&wndPtr->class->wc.lpszMenuName; break;
-        case GCL_WNDPROC:  ptr = (LONG*)&wndPtr->class->wc.lpfnWndProc; break;
+        case GCL_STYLE:      ptr = (LONG*)&wndPtr->class->style; break;
+        case GCL_CBWNDEXTRA: ptr = (LONG*)&wndPtr->class->cbWndExtra; break;
+        case GCL_CBCLSEXTRA: ptr = (LONG*)&wndPtr->class->cbClsExtra; break;
+        case GCL_MENUNAME:   ptr = (LONG*)&wndPtr->class->lpszMenuName; break;
+        case GCL_WNDPROC:    ptr = (LONG*)&wndPtr->class->lpfnWndProc; break;
         default:
             fprintf( stderr, "Warning: invalid offset %d for SetClassLong()\n",
                      offset);
@@ -371,7 +441,7 @@
 /***********************************************************************
  *           GetClassInfo      (USER.404)
  */
-BOOL GetClassInfo( HANDLE hInstance, SEGPTR name, LPWNDCLASS lpWndClass )
+BOOL GetClassInfo( HANDLE hInstance, SEGPTR name, WNDCLASS16 *lpWndClass )
 {
     CLASS *classPtr;
 
@@ -382,9 +452,19 @@
     hInstance = GetExePtr( hInstance );
     
     if (!(classPtr = CLASS_FindClassByName( name, hInstance ))) return FALSE;
-    if (hInstance && (hInstance != classPtr->wc.hInstance)) return FALSE;
+    if (hInstance && (hInstance != classPtr->hInstance)) return FALSE;
 
-    memcpy(lpWndClass, &(classPtr->wc), sizeof(WNDCLASS));
+    lpWndClass->style         = (UINT16)classPtr->style;
+    lpWndClass->lpfnWndProc   = classPtr->lpfnWndProc;
+    lpWndClass->cbClsExtra    = (INT16)classPtr->cbClsExtra;
+    lpWndClass->cbWndExtra    = (INT16)classPtr->cbWndExtra;
+    lpWndClass->hInstance     = classPtr->hInstance;
+    lpWndClass->hIcon         = classPtr->hIcon;
+    lpWndClass->hCursor       = classPtr->hCursor;
+    lpWndClass->hbrBackground = classPtr->hbrBackground;
+    lpWndClass->lpszMenuName  = classPtr->lpszMenuName;
+    lpWndClass->lpszClassName = 0;
+
     return TRUE;
 }
 
@@ -414,7 +494,7 @@
         pClassEntry->wNext = 0;
         return FALSE;
     }
-    pClassEntry->hInst = class->wc.hInstance;
+    pClassEntry->hInst = class->hInstance;
     pClassEntry->wNext++;
     GlobalGetAtomName( class->atomName, pClassEntry->szClassName,
                        sizeof(pClassEntry->szClassName) );
diff --git a/windows/dce.c b/windows/dce.c
index afdf32e..359ce9b 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -310,9 +310,9 @@
                    DCX_CLIPSIBLINGS | DCX_PARENTCLIP);
 	if (wndPtr)
 	{
-            if (!(wndPtr->class->wc.style & (CS_OWNDC | CS_CLASSDC)))
+            if (!(wndPtr->class->style & (CS_OWNDC | CS_CLASSDC)))
 		flags |= DCX_CACHE;
-            if (wndPtr->class->wc.style & CS_PARENTDC) flags |= DCX_PARENTCLIP;
+            if (wndPtr->class->style & CS_PARENTDC) flags |= DCX_PARENTCLIP;
 	    if (wndPtr->dwStyle & WS_CLIPCHILDREN) flags |= DCX_CLIPCHILDREN;
 	    if (wndPtr->dwStyle & WS_CLIPSIBLINGS) flags |= DCX_CLIPSIBLINGS;
 	}
diff --git a/windows/defdlg.c b/windows/defdlg.c
index 9191ba8..fa6f275 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -147,8 +147,8 @@
 	      /* Free dialog heap (if created) */
 	    if (dlgInfo->hDialogHeap)
 	    {
-		GlobalUnlock(dlgInfo->hDialogHeap);
-		GlobalFree(dlgInfo->hDialogHeap);
+		GlobalUnlock16(dlgInfo->hDialogHeap);
+		GlobalFree16(dlgInfo->hDialogHeap);
 		dlgInfo->hDialogHeap = 0;
 	    }
 
diff --git a/windows/defwnd.c b/windows/defwnd.c
index cce7311..dfa6478 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -28,6 +28,30 @@
 static short iMenuSysKey = 0;
 
 /***********************************************************************
+ *           DEFWND_InitSysMenuPopup
+ *
+ * Handle the WM_INITMENUPOPUP message on the system menu.
+ */
+static void DEFWND_InitSysMenuPopup( HMENU hmenu, DWORD style, DWORD clsStyle )
+{
+    BOOL gray;
+
+    gray = !(style & WS_THICKFRAME) || (style & (WS_MAXIMIZE | WS_MINIMIZE));
+    EnableMenuItem( hmenu, SC_SIZE, (gray ? MF_GRAYED : MF_ENABLED) );
+    gray = ((style & WS_MAXIMIZE) != 0);
+    EnableMenuItem( hmenu, SC_MOVE, (gray ? MF_GRAYED : MF_ENABLED) );
+    gray = !(style & WS_MINIMIZEBOX) || (style & WS_MINIMIZE);
+    EnableMenuItem( hmenu, SC_MINIMIZE, (gray ? MF_GRAYED : MF_ENABLED) );
+    gray = !(style & WS_MAXIMIZEBOX) || (style & WS_MAXIMIZE);
+    EnableMenuItem( hmenu, SC_MAXIMIZE, (gray ? MF_GRAYED : MF_ENABLED) );
+    gray = !(style & (WS_MAXIMIZE | WS_MINIMIZE));
+    EnableMenuItem( hmenu, SC_RESTORE, (gray ? MF_GRAYED : MF_ENABLED) );
+    gray = (clsStyle & CS_NOCLOSE) != 0;
+    EnableMenuItem( hmenu, SC_CLOSE, (gray ? MF_GRAYED : MF_ENABLED) );
+}
+
+
+/***********************************************************************
  *           DEFWND_SetText
  *
  * Set the window text.
@@ -87,7 +111,7 @@
 
     case WM_LBUTTONDBLCLK:
     case WM_NCLBUTTONDBLCLK:
-	return NC_HandleNCLButtonDblClk( hwnd, wParam, lParam );
+	return NC_HandleNCLButtonDblClk( wndPtr, wParam, lParam );
 
     case WM_NCACTIVATE:
 	return NC_HandleNCActivate( hwnd, wParam );
@@ -162,18 +186,18 @@
     case WM_ERASEBKGND:
     case WM_ICONERASEBKGND:
 	{
-	    if (!wndPtr->class->wc.hbrBackground) return 0;
-            if (wndPtr->class->wc.hbrBackground <= (HBRUSH)(COLOR_MAX+1))
+	    if (!wndPtr->class->hbrBackground) return 0;
+            if (wndPtr->class->hbrBackground <= (HBRUSH)(COLOR_MAX+1))
             {
                  HBRUSH hbrush;
                  hbrush = CreateSolidBrush(
-                     GetSysColor(((DWORD)wndPtr->class->wc.hbrBackground)-1));
+                     GetSysColor(((DWORD)wndPtr->class->hbrBackground)-1));
                  FillWindow( GetParent(hwnd), hwnd, (HDC)wParam, hbrush);
                  DeleteObject (hbrush);
             }
             else
 	         FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
-                             wndPtr->class->wc.hbrBackground );
+                             wndPtr->class->hbrBackground );
 	    return 1;
 	}
 
@@ -338,6 +362,13 @@
 	ShowWindow(hwnd,(wParam)? SW_SHOWNOACTIVATE: SW_HIDE);
 	break; 
 
+    case WM_INITMENUPOPUP:
+        /* Not absolutely sure this belongs here -- AJ */
+        if (HIWORD(lParam))  /* system menu */
+            DEFWND_InitSysMenuPopup( (HMENU)wParam, wndPtr->dwStyle,
+                                     wndPtr->class->style );
+        break;
+
     case WM_CANCELMODE:
 
 	/* EndMenu() should be called if in menu state but currently it's
@@ -378,5 +409,3 @@
     }
     return 0;
 }
-
-
diff --git a/windows/dialog.c b/windows/dialog.c
index ee3f402..33a93b4 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -311,8 +311,8 @@
     rect.right -= rect.left;
     rect.bottom -= rect.top;
 
-    if ((INT)template.x == CW_USEDEFAULT)
-        rect.left = rect.top = CW_USEDEFAULT;
+    if ((INT16)template.x == CW_USEDEFAULT16)
+        rect.left = rect.top = CW_USEDEFAULT16;
     else
     {
         rect.left += template.x * xUnit / 4;
@@ -321,7 +321,7 @@
             ClientToScreen( owner, (POINT *)&rect );
     }
 
-    hwnd = CreateWindowEx( exStyle, template.className, template.caption, 
+    hwnd = CreateWindowEx16( exStyle, template.className, template.caption, 
 			   template.style & ~WS_VISIBLE,
 			   rect.left, rect.top, rect.right, rect.bottom,
 			   owner, hMenu, hInst, (SEGPTR)0 );
@@ -333,23 +333,6 @@
     }
     wndPtr = WIN_FindWndPtr( hwnd );
 
-      /* Purge junk from system menu */
-      /* FIXME: this doesn't belong here */
-
-    DeleteMenu(wndPtr->hSysMenu,SC_SIZE,MF_BYCOMMAND);
-    if (!(wndPtr->dwStyle & WS_MAXIMIZEBOX) )
-    {
-        DeleteMenu(wndPtr->hSysMenu,SC_MAXIMIZE,MF_BYCOMMAND);
-        if( !(wndPtr->dwStyle & WS_MINIMIZEBOX) )
-        {
-            DeleteMenu(wndPtr->hSysMenu,SC_MINIMIZE,MF_BYCOMMAND);
-            DeleteMenu(wndPtr->hSysMenu,SC_RESTORE,MF_BYCOMMAND);
-        }
-    }
-    else
-        if (!(wndPtr->dwStyle & WS_MINIMIZEBOX) )
-            DeleteMenu(wndPtr->hSysMenu,SC_MINIMIZE,MF_BYCOMMAND);
-
       /* Create control windows */
 
     dprintf_dialog(stddeb, " BEGIN\n" );
@@ -400,7 +383,7 @@
         {
 	    if (!dlgInfo->hDialogHeap)
             {
-		dlgInfo->hDialogHeap = GlobalAlloc(GMEM_FIXED, 0x10000);
+		dlgInfo->hDialogHeap = GlobalAlloc16(GMEM_FIXED, 0x10000);
 		if (!dlgInfo->hDialogHeap)
                 {
 		    fprintf(stderr,"CreateDialogIndirectParam: Insufficient memory to create heap for edit control\n");
@@ -408,7 +391,7 @@
 		}
 		LocalInit(dlgInfo->hDialogHeap, 0, 0xffff);
 	    }
-	    hwndCtrl = CreateWindowEx(WS_EX_NOPARENTNOTIFY, className, winName,
+	    hwndCtrl = CreateWindowEx16(WS_EX_NOPARENTNOTIFY, className, winName,
                                       header.style | WS_CHILD,
                                       header.x * xUnit / 4,
                                       header.y * yUnit / 8,
@@ -419,14 +402,15 @@
 	}
 	else
         {
-	    hwndCtrl = CreateWindowEx(WS_EX_NOPARENTNOTIFY, className, winName,
-                                      header.style | WS_CHILD,
-                                      header.x * xUnit / 4,
-                                      header.y * yUnit / 8,
-                                      header.cx * xUnit / 4,
-                                      header.cy * yUnit / 8,
-                                      hwnd, (HMENU)header.id,
-                                      hInst, (SEGPTR)0 );
+	    hwndCtrl = CreateWindowEx16( WS_EX_NOPARENTNOTIFY, className,
+                                         winName,
+                                         header.style | WS_CHILD,
+                                         header.x * xUnit / 4,
+                                         header.y * yUnit / 8,
+                                         header.cx * xUnit / 4,
+                                         header.cy * yUnit / 8,
+                                         hwnd, (HMENU)header.id,
+                                         hInst, (SEGPTR)0 );
 	}
 
         /* Make the control last one in Z-order, so that controls remain
@@ -553,9 +537,9 @@
     HWND hwnd;
     SEGPTR ptr;
 
-    if (!(ptr = (SEGPTR)WIN16_GlobalLock( dlgTemplate ))) return -1;
+    if (!(ptr = (SEGPTR)WIN16_GlobalLock16( dlgTemplate ))) return -1;
     hwnd = CreateDialogIndirectParam( hInst, ptr, owner, dlgProc, param );
-    GlobalUnlock( dlgTemplate );
+    GlobalUnlock16( dlgTemplate );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
     return -1;
 }
diff --git a/windows/event.c b/windows/event.c
index 098d876..2924ffc 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -562,7 +562,7 @@
 
 	WINPOS_SendNCCalcSize( winpos.hwnd, TRUE, &newWindowRect,
 			       &wndPtr->rectWindow, &wndPtr->rectClient,
-			       &winpos, &newClientRect );
+			       MAKE_SEGPTR(&winpos), &newClientRect );
 
 	/* Set new size and position */
 	wndPtr->rectWindow = newWindowRect;
@@ -593,10 +593,10 @@
             /* Don't worry if we can't open */
 	    BOOL couldOpen=OpenClipboard(hwnd);
 	    hText=GetClipboardData(CF_TEXT);
-	    text=GlobalLock(hText);
+	    text=GlobalLock16(hText);
 	    XChangeProperty(display,request,rprop,XA_STRING,
 		8,PropModeReplace,text,strlen(text));
-	    GlobalUnlock(hText);
+	    GlobalUnlock16(hText);
 	    /* close only if we opened before */
 	    if(couldOpen)CloseClipboard();
 	}
diff --git a/windows/graphics.c b/windows/graphics.c
index 0a68479..bb2919a 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -808,7 +808,7 @@
 /**********************************************************************
  *          PolyPolygon  (GDI.450)
  */
-BOOL PolyPolygon( HDC hdc, LPPOINT pt, LPINT counts, WORD polygons )
+BOOL PolyPolygon( HDC hdc, LPPOINT pt, LPINT16 counts, WORD polygons )
 {
     HRGN hrgn;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -999,8 +999,8 @@
 /**********************************************************************
  *          DrawEdge  (USER.659)
  */
-BOOL WINAPI 
-DrawEdge(HDC hdc, LPRECT qrc, UINT edge, UINT flags) {
+BOOL DrawEdge(HDC hdc, LPRECT qrc, UINT edge, UINT flags)
+{
 	fprintf(stdnimp,"DrawEdge(%x,%p,%d,%x), empty stub!\n",
 		hdc,qrc,edge,flags
 	);
@@ -1010,8 +1010,8 @@
 /**********************************************************************
  *          DrawFrameControl  (USER.656)
  */
-BOOL WINAPI 
-DrawFrameControl(HDC hdc, LPRECT qrc, UINT edge, UINT flags) {
+BOOL DrawFrameControl(HDC hdc, LPRECT qrc, UINT edge, UINT flags)
+{
 	fprintf(stdnimp,"DrawFrameControl(%x,%p,%d,%x), empty stub!\n",
 		hdc,qrc,edge,flags
 	);
diff --git a/windows/hook.c b/windows/hook.c
index d68e038..3b46e9f 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -50,7 +50,7 @@
     MESSAGEQUEUE *queue;
     HANDLE hook = 0;
 
-    if ((queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(hQueue) )) != NULL)
+    if ((queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(hQueue) )) != NULL)
         hook = queue->hooks[id - WH_FIRST_HOOK];
     if (!hook) hook = HOOK_systemHooks[id - WH_FIRST_HOOK];
     return hook;
@@ -103,7 +103,7 @@
 
     if (hQueue)
     {
-        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( hQueue );
+        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( hQueue );
         data->next = queue->hooks[id - WH_FIRST_HOOK];
         queue->hooks[id - WH_FIRST_HOOK] = handle;
     }
@@ -141,7 +141,7 @@
 
     if (data->ownerQueue)
     {
-        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( data->ownerQueue );
+        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( data->ownerQueue );
         if (!queue) return FALSE;
         prevHook = &queue->hooks[data->id - WH_FIRST_HOOK];
     }
@@ -182,7 +182,7 @@
 
     /* Now call it */
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
     prevHook = queue->hCurHook;
     queue->hCurHook = hook;
     data->inHookProc = 1;
@@ -326,7 +326,7 @@
     MESSAGEQUEUE *queue;
     HANDLE next;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
     if (!(next = HOOK_GetNextHook( queue->hCurHook ))) return 0;
     return HOOK_CallHook( next, code, wParam, lParam );
 }
diff --git a/windows/keyboard.c b/windows/keyboard.c
index 7dae630..ac6cc0f 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -37,7 +37,7 @@
 /**********************************************************************
  *		GetKeyboardState			[USER.222]
  */
-void GetKeyboardState(BYTE FAR *lpKeyState)
+void GetKeyboardState(BYTE *lpKeyState)
 {
     if (lpKeyState != NULL) {
 	KeyStateTable[VK_LBUTTON] = MouseButtonsStates[0] >> 8;
@@ -50,7 +50,7 @@
 /**********************************************************************
  *      SetKeyboardState            [USER.223]
  */
-void SetKeyboardState(BYTE FAR *lpKeyState)
+void SetKeyboardState(BYTE *lpKeyState)
 {
     if (lpKeyState != NULL) {
 	memcpy(KeyStateTable, lpKeyState, 256);
diff --git a/windows/mdi.c b/windows/mdi.c
index ea7a450..a97cfcf 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -312,7 +312,7 @@
 
     ci->nActiveChildren++;
  
-    hwnd = CreateWindow( cs->szClass, cs->szTitle,
+    hwnd = CreateWindow16( cs->szClass, cs->szTitle,
 			  WS_CHILD | WS_BORDER | WS_CAPTION | WS_CLIPSIBLINGS |
 			  WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU |
 			  WS_THICKFRAME | WS_VISIBLE | cs->style,
@@ -1433,8 +1433,8 @@
  short 	 newPos=-1;
  short 	 curPos;
  short 	 length;
- INT 	 minPos;
- INT 	 maxPos;
+ INT16 	 minPos;
+ INT16 	 maxPos;
  short   shift;
 
  if( !wndPtr ) return;
diff --git a/windows/message.c b/windows/message.c
index 1237a8e..c33ad1f 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -127,7 +127,7 @@
 	if (dbl_click && (hittest == HTCLIENT))
 	{
 	    /* Check whether window wants the double click message. */
-            dbl_click = (pWnd->class->wc.style & CS_DBLCLKS) != 0;
+            dbl_click = (pWnd->class->style & CS_DBLCLKS) != 0;
 	}
 
 	if (dbl_click) switch(msg->message)
@@ -410,7 +410,7 @@
     while(1)
     {    
 	hQueue   = GetTaskQueue(0);
-        msgQueue = (MESSAGEQUEUE *)GlobalLock( hQueue );
+        msgQueue = (MESSAGEQUEUE *)GlobalLock16( hQueue );
         if (!msgQueue) return FALSE;
 
 	  /* First handle a message put by SendMessage() */
@@ -706,7 +706,7 @@
     DDE_GetRemoteMessage();
 #endif  /* CONFIG_IPC */
     
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return;
     if ((queue->wPostQMsg) || 
         (queue->status & (QS_SENDMESSAGE | QS_PAINT)) ||
         (queue->msgCount) || (QUEUE_GetSysQueue()->msgCount) )
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 57ba892..2538eb1 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -643,10 +643,10 @@
      */
     if (IsIconic(hwnd))
     {
-        if (wndPtr->class->wc.hIcon)
+        if (wndPtr->class->hIcon)
         {
             SendMessage(hwnd, WM_ICONERASEBKGND, (WPARAM)hdc, 0);
-            DrawIcon( hdc, 0, 0, wndPtr->class->wc.hIcon );
+            DrawIcon( hdc, 0, 0, wndPtr->class->hIcon );
         }
         ReleaseDC(hwnd, hdc);
         wndPtr->flags &= ~WIN_INTERNAL_PAINT;
@@ -782,9 +782,9 @@
 	{
 	    WND *wndPtr;
 	    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) break;
-	    if (wndPtr->class->wc.hCursor)
+	    if (wndPtr->class->hCursor)
 	    {
-		SetCursor( wndPtr->class->wc.hCursor );
+		SetCursor( wndPtr->class->hCursor );
 		return TRUE;
 	    }
 	    else return FALSE;
@@ -1261,30 +1261,31 @@
  *
  * Handle a WM_NCLBUTTONDBLCLK message. Called from DefWindowProc().
  */
-LONG NC_HandleNCLButtonDblClk( HWND hwnd, WPARAM wParam, LPARAM lParam )
+LONG NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM wParam, LPARAM lParam )
 {
     /*
      * if this is an icon, send a restore since we are handling
      * a double click
      */
-    if (IsIconic(hwnd))
+    if (pWnd->dwStyle & WS_MINIMIZE)
     {
-      SendMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, lParam);
-      return 0;
+        SendMessage( pWnd->hwndSelf, WM_SYSCOMMAND, SC_RESTORE, lParam );
+        return 0;
     } 
 
     switch(wParam)  /* Hit test */
     {
     case HTCAPTION:
         /* stop processing if WS_MAXIMIZEBOX is missing */
-
-        if( GetWindowLong( hwnd , GWL_STYLE) & WS_MAXIMIZEBOX )
-            SendMessage( hwnd, WM_SYSCOMMAND,
-                         IsZoomed(hwnd) ? SC_RESTORE : SC_MAXIMIZE, lParam );
+        if (pWnd->dwStyle & WS_MAXIMIZEBOX)
+            SendMessage( pWnd->hwndSelf, WM_SYSCOMMAND,
+                      (pWnd->dwStyle & WS_MAXIMIZE) ? SC_RESTORE : SC_MAXIMIZE,
+                      lParam );
 	break;
 
     case HTSYSMENU:
-	SendMessage( hwnd, WM_SYSCOMMAND, SC_CLOSE, lParam );
+        if (!(pWnd->class->style & CS_NOCLOSE))
+            SendMessage( pWnd->hwndSelf, WM_SYSCOMMAND, SC_CLOSE, lParam );
 	break;
     }
     return 0;
diff --git a/windows/painting.c b/windows/painting.c
index d3f7694..9356523 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -303,7 +303,10 @@
 
       /* Erase/update window */
 
-    if (flags & RDW_UPDATENOW) SendMessage( hwnd, WM_PAINT, 0, 0 );
+    if (flags & RDW_UPDATENOW)
+    {
+        if (wndPtr->hrgnUpdate) SendMessage( hwnd, WM_PAINT, 0, 0 );
+    }
     else if (flags & RDW_ERASENOW)
     {
         if (wndPtr->flags & WIN_NEEDS_NCPAINT)
@@ -318,7 +321,7 @@
               /* Don't send WM_ERASEBKGND to icons */
               /* (WM_ICONERASEBKGND is sent during processing of WM_NCPAINT) */
                 if (!(wndPtr->dwStyle & WS_MINIMIZE) ||
-                    !wndPtr->class->wc.hIcon)
+                    !wndPtr->class->hIcon)
                 {
                     if (SendMessage( hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0 ))
                         wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
diff --git a/windows/queue.c b/windows/queue.c
index 04d8081..c874f39 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -25,8 +25,8 @@
 {
     MESSAGEQUEUE *pq; 
 
-    if (!(pq = (MESSAGEQUEUE*) GlobalLock( hQueue )) ||
-        GlobalSize(hQueue) < sizeof(MESSAGEQUEUE) + pq->queueSize*sizeof(QMSG))
+    if (!(pq = (MESSAGEQUEUE*) GlobalLock16( hQueue )) ||
+        GlobalSize16(hQueue) < sizeof(MESSAGEQUEUE)+pq->queueSize*sizeof(QMSG))
     {
         fprintf( stderr, "%04x is not a queue handle\n", hQueue );
         return;
@@ -65,7 +65,7 @@
     fprintf( stderr, "Queue Size Msgs Task\n" );
     while (hQueue)
     {
-        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( hQueue );
+        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16( hQueue );
         if (!queue)
         {
             fprintf( stderr, "*** Bad queue handle %04x\n", hQueue );
@@ -94,13 +94,13 @@
     dprintf_msg(stddeb,"Creating message queue...\n");
 
     queueSize = sizeof(MESSAGEQUEUE) + size * sizeof(QMSG);
-    if (!(hQueue = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, queueSize )))
+    if (!(hQueue = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, queueSize )))
         return 0;
-    msgQueue = (MESSAGEQUEUE *) GlobalLock( hQueue );
+    msgQueue = (MESSAGEQUEUE *) GlobalLock16( hQueue );
     msgQueue->msgSize = sizeof(QMSG);
     msgQueue->queueSize = size;
     msgQueue->wWinVersion = 0;  /* FIXME? */
-    GlobalUnlock( hQueue );
+    GlobalUnlock16( hQueue );
     return hQueue;
 }
 
@@ -112,7 +112,7 @@
  */
 BOOL QUEUE_DeleteMsgQueue( HQUEUE hQueue )
 {
-    MESSAGEQUEUE * msgQueue = (MESSAGEQUEUE*)GlobalLock(hQueue);
+    MESSAGEQUEUE * msgQueue = (MESSAGEQUEUE*)GlobalLock16(hQueue);
     HQUEUE *pPrev;
 
     dprintf_msg(stddeb,"Deleting message queue %04x\n", hQueue);
@@ -126,11 +126,11 @@
     pPrev = &hFirstQueue;
     while (*pPrev && (*pPrev != hQueue))
     {
-        MESSAGEQUEUE *msgQ = (MESSAGEQUEUE*)GlobalLock(*pPrev);
+        MESSAGEQUEUE *msgQ = (MESSAGEQUEUE*)GlobalLock16(*pPrev);
         pPrev = &msgQ->next;
     }
     if (*pPrev) *pPrev = msgQueue->next;
-    GlobalFree( hQueue );
+    GlobalFree16( hQueue );
     return 1;
 }
 
@@ -146,7 +146,7 @@
     if (size > MAX_QUEUE_SIZE) size = MAX_QUEUE_SIZE;
     else if (size <= 0) size = 1;
     if (!(hmemSysMsgQueue = QUEUE_CreateMsgQueue( size ))) return FALSE;
-    sysMsgQueue = (MESSAGEQUEUE *) GlobalLock( hmemSysMsgQueue );
+    sysMsgQueue = (MESSAGEQUEUE *) GlobalLock16( hmemSysMsgQueue );
     return TRUE;
 }
 
@@ -170,7 +170,7 @@
     int pos;
     MESSAGEQUEUE *msgQueue;
 
-    if (!(msgQueue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return FALSE;
+    if (!(msgQueue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return FALSE;
     pos = msgQueue->nextFreeMessage;
 
       /* Check if queue is full */
@@ -311,7 +311,7 @@
  */
 HTASK QUEUE_GetQueueTask( HQUEUE hQueue )
 {
-    MESSAGEQUEUE *queue = GlobalLock( hQueue );
+    MESSAGEQUEUE *queue = GlobalLock16( hQueue );
     return (queue) ? queue->hTask : 0 ;
 }
 
@@ -323,7 +323,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return;
     queue->wPaintCount++;
     queue->status |= QS_PAINT;
     queue->tempStatus |= QS_PAINT;    
@@ -337,7 +337,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return;
     queue->wPaintCount--;
     if (!queue->wPaintCount) queue->status &= ~QS_PAINT;
 }
@@ -350,7 +350,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return;
     queue->wTimerCount++;
     queue->status |= QS_TIMER;
     queue->tempStatus |= QS_TIMER;
@@ -364,7 +364,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( hQueue ))) return;
     queue->wTimerCount--;
     if (!queue->wTimerCount) queue->status &= ~QS_TIMER;
 }
@@ -377,7 +377,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return;
     queue->wPostQMsg = TRUE;
     queue->wExitCode = (WORD)exitCode;
 }
@@ -417,7 +417,7 @@
     if ((hQueue = GetTaskQueue(0)) != 0) QUEUE_DeleteMsgQueue( hQueue );
 
     /* Link new queue into list */
-    queuePtr = (MESSAGEQUEUE *)GlobalLock( hNewQueue );
+    queuePtr = (MESSAGEQUEUE *)GlobalLock16( hNewQueue );
     queuePtr->hTask = GetCurrentTask();
     queuePtr->next  = hFirstQueue;
     hFirstQueue = hNewQueue;
@@ -435,7 +435,7 @@
     MESSAGEQUEUE *queue;
     DWORD ret;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
     ret = MAKELONG( queue->tempStatus, queue->status );
     queue->tempStatus = 0;
     return ret & MAKELONG( flags, flags );
@@ -449,7 +449,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return FALSE;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return FALSE;
     return queue->status & (QS_KEY | QS_MOUSEBUTTON);
 }
 
@@ -461,7 +461,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
     return queue->GetMessagePosVal;
 }
 
@@ -473,7 +473,7 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
     return queue->GetMessageTimeVal;
 }
 
@@ -485,6 +485,6 @@
 {
     MESSAGEQUEUE *queue;
 
-    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
     return queue->GetMessageExtraInfoVal;
 }
diff --git a/windows/syscolor.c b/windows/syscolor.c
index 4e5bc07..50e03b8 100644
--- a/windows/syscolor.c
+++ b/windows/syscolor.c
@@ -160,7 +160,7 @@
  *             SetSysColors          (USER.181)
  */
 
-void SetSysColors(int nChanges, LPINT lpSysColor, COLORREF *lpColorValues)
+void SetSysColors(int nChanges, LPINT16 lpSysColor, COLORREF *lpColorValues)
 {
     int i;
 
diff --git a/windows/utility.c b/windows/utility.c
deleted file mode 100644
index e3e1780..0000000
--- a/windows/utility.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/*	utility.c	Utility functions for Wine
- *			Author:		Andrew Bulhak
- *			Commenced:	10-9-1993
- *
- *			This unit contains the implementations of
- *			various Windows API functions that perform
- *			utility tasks; i.e., that do not fit into
- *			any major category but perform useful tasks.
- */
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include "windows.h"
-#include "ldt.h"
-#include "stackframe.h"
-#include "stddebug.h"
-#include "debug.h"
-
-
-
-/*	MulDiv is a simple function that may as well have been
- *	implemented as a macro; however Microsoft, in their infinite
- *	wisdom, have implemented it as a DLL function and therefore
- *	so should we. 
- *	Basically, it takes two 16-bit integers, multiplies them
- *	and divides by a third integer.
- */
-
-#ifdef WINELIB32
-INT MulDiv(INT foo, INT bar, INT baz)
-{
-#ifdef __GNUC__
-    long long ret;
-    if (!baz) return -1;
-    ret = ((long long)foo * bar) / baz;
-    if ((ret > 2147483647) || (ret < -2147483647)) return -1;
-    return ret;
-#else
-    if (!baz) return -1;
-    return (foo * bar) / baz;
-#endif
-}
-#else  /* WINELIB32 */
-INT MulDiv(INT foo, INT bar, INT baz)
-{
-    int ret;
-    if (!baz) return -32768;
-    ret = (foo * bar) / baz;
-    if ((ret > 32767) || (ret < -32767)) return -32768;
-    return ret;
-}
-#endif
-
-/*	UTILITY_strip015() removes \015 (^M, CR) from a string;
- *	this is done to convert a MS-DOS-style string to a more
- *	UNIX-friendly format. Replacement is done in-place.
- */
-
-void UTILITY_strip015(char *dest) {
-	char *src = dest;
-
-	while(*src) {
-		while(*src == '\015') src++;	/* Skip \015s */
-		while((*src) && (*src != '\015')) *(dest++) = *(src++);
-	};
-	*dest = '\0';	/* Add null terminator */
-};
-
-/**********************************************************************
- *					DebugPrintString
- */
-int
-DebugPrintString(char *str)
-{
-    fprintf(stderr, "%s\n", str);
-    return 0;
-}
-
-/*
- *	OutputDebugString strips CRs from its (string) parameter and
- *	calls DebugPrintString(), which was written by someone else. 
- *	Since this is part of the standard Windows API, it needs no 
- *	references to nonstandard DLLs.
- */
-
-void OutputDebugString(LPSTR foo)
-{
-	UTILITY_strip015(foo);
-	DebugPrintString(foo);
-};
-
-#if 0
-/*	UTILITY_qualify(source, dest) takes the format string source and
- *	changes all the parameters to correspond to Linux integer sizes
- *	rather than Windows sizes. For example, it converts %i to %hi
- *	and %lx to %x. No array size checking is done at present.
- */
-
-static void UTILITY_qualify(const char *source, char *dest)
-{
-	dprintf_utility(stddeb, "UTILITY_qualify(\"%s\", \"%s\");\n", 
-			source, dest);
-	if(!source) return;	/* Dumbass attack! */
-	while(*source) {
-		/* Find next format code. */
-		while((*source != '%') && (*source)) {
-			*(dest++) = *(source++);
-		}
-		/* Yeah, I know I shouldn't use gotos.... */
-		if (!(*source)) goto loop_end;
-		/* skip the '%' */
-		*(dest++) = *(source++);
-		/* Now insert a size qualifier, if needed. */
-		switch(*source) {
-			case 'i':
-			case 'd':
-			case 'x':
-			case 'X':
-			case 'u':
-			case 'o':
-				/* We have a 16-bit value here. */
-				*(dest++) = 'h';
-				break;
-		};
-		/* Here we go 'round the mulberry bush... */
-loop_end:
-	};
-	*dest = '\0';
-};
-#endif
-
-/*	UTILITY_argsize() evaluates the size of the argument list that
- *	accompanies a vsprintf() or wvsprintf() call.
- *	Arguments:
- *		char *format;	printf-style format string.
- *		BOOL windows;	if this is TRUE, we assume that ints are
- *				16 bits in size; otherwise we deal with
- *				32-bit variables.
- *	Returns:
- *		size (in bytes) of the arguments that follow the call.
- */
-
-size_t UTILITY_argsize(const char *format, BOOL windows)
-{
-	size_t size = 0;
-
-#define INT_SIZE (windows ? 2 : 4)
-
-	while(*format) {
-		while((*format) && (*format != '%')) format++;	/* skip ahead */
-		if(*format) {
-			char modifier = ' ';
-			dprintf_utility(stddeb, "found:\t\"%%");
-			format++;		/* skip past '%' */
-			/* First skip the flags, field width, etc. */
-			/* First the flags */
-			if ((*format == '#') || (*format == '-') || (*format == '+')
-				|| (*format == ' ')) {
-				dprintf_utility(stddeb, "%c", *format);
-				format++;
-			}
-			/* Now the field width, etc. */
-			while(isdigit(*format)) {
-				dprintf_utility(stddeb, "%c", *format);
-				format++;
-			}
-			if(*format == '.') {
-				dprintf_utility(stddeb, "%c", *format);
-				format++;
-			}
-			while(isdigit(*format)) {
-				dprintf_utility(stddeb, "%c", *format);
-				format++;
-			}
-			/* Now we handle the rest */
-			if((*format == 'h') || (*format == 'l') || (*format == 'L')) {
-				dprintf_utility(stddeb, "%c", modifier);
-				modifier = *(format++);
-			}
-			/* Handle the actual type. */
-				dprintf_utility(stddeb, "%c\"\n", *format);
-			switch(*format) {
-				case 'd':
-				case 'i':
-				case 'o':
-				case 'x':
-				case 'X':
-				case 'u':
-				case 'c':
-					size += ((modifier == 'l') ? 4 : INT_SIZE);
-					break;
-				case 's': size += sizeof(char *); break;
-				case 'e':
-				case 'E':
-				case 'f':
-				case 'g':
-				case 'G':
-					/* It doesn't look as if Windows' wvsprintf()
-					   supports floating-point arguments. However,
-					   I'll leave this code here just in case. */
-					size += (modifier == 'L') ? sizeof(long double) : sizeof(double);
-					break;
-				case 'p': size += sizeof(void *); break;
-				case 'n': size += sizeof(int *); break;
-			};
-		};
-	};
-#undef INT_SIZE
-	dprintf_utility(stddeb, "UTILITY_argsize: returning %i\n", size);
-	return size;
-};
-
-/*	UTILITY_convertArgs() creates a 32-bit argument list from a 16-bit list.
- *	This is used to allow wvsprintf() arguments to be fed through 
- *	vsprintf().
- *
- *	Arguments:
- *		char *fmt;	format string
- *		char *winarg;	Windows-style arguments
- *	
- *	Returns:
- *		malloc()ed pointer to new argument list. This should
- *		be free()d as soon as it is finished with.
- */
-
-char *UTILITY_convertArgs(char *format, char *winarg)
-{
-    char *result = (char *)malloc(UTILITY_argsize(format, 0));
-    char *rptr = result;
-    short *wptr = (short *)winarg;
-    long *dptr = (long *)result;
-    
-    while(*format) {
-	while((*format) && (*format != '%')) format++;	/* skip ahead */
-	if(*format) {
-	    char modifier = ' ';
-	    dprintf_utility(stddeb, "found:\t\"%%");
-	    format++;		/* skip past '%' */
-	    
-	    /* First skip the flags, field width, etc. */
-	    /* First the flags */
-	    if (*format == '#' || *format == '-' || *format == '+'
-		|| *format == ' ') format++;
-	    
-	    /* Now the field width, etc. */
-	    while (isdigit(*format)) format++;
-	    if (*format == '.') format++;
-	    while (isdigit(*format)) format++;
-	    
-	    /* Now we handle the rest */
-	    if(*format == 'h' || *format == 'l' || *format == 'L')
-	        modifier = *format++;
-	    
-	    /* Handle the actual type. */
-	    dprintf_utility(stddeb, "%c\"\n", *format);
-	    
-	    switch(*format) {
-	     case 'd':
-	     case 'i':
-		if (modifier == 'l') {
-		    *((int *)rptr)++ = *((int *)winarg)++;
-		} else {
-		    *((int *)rptr)++ = *((short *)winarg)++;
-		}
-		break;
-	     case 'o':
-	     case 'x':
-	     case 'X':
-	     case 'u':
-	     case 'c':
-		if (modifier == 'l')  {
-		    *((unsigned int *)rptr)++ =  *((unsigned int *)winarg)++;
-		} else {
-		    *((unsigned int *)rptr)++ = *((unsigned short *)winarg)++;
-		}
-		break;
-	     case 's':
-	     case 'p':
-	     case 'n':	/* A pointer, is a pointer, is a pointer... */
-		*((char **)rptr)++ = (char *)PTR_SEG_TO_LIN(*(SEGPTR *)winarg);
-		((SEGPTR *)winarg)++;
-		break;
-	     case 'e':
-	     case 'E':
-	     case 'f':
-	     case 'g':
-	     case 'G':
-		/* It doesn't look as if Windows' wvsprintf()
-		 supports floating-point arguments. However,
-		 I'll leave this code here just in case. */
-		if(modifier=='L')
-		    *((long double *)rptr)++ = *((long double *)winarg)++;
-		else
-		    *((double *)rptr)++ = *((double *)winarg)++;
-		break;
-	    }
-	}
-    }
-    for(; (char *)dptr < rptr; dptr ++)
-        dprintf_utility( stddeb, "%08lx ", *dptr );
-    dprintf_utility( stddeb, "\n" );
-    for(; (char *)wptr < winarg; wptr ++)
-        dprintf_utility( stddeb, "%04x ", *wptr );
-    dprintf_utility( stddeb, "\n" );
-    return result;
-};
-
-#ifndef WINELIB
-INT windows_wsprintf(void)
-{
-    LPSTR lpOutput, lpFormat, ptr;
-    BYTE new_stack[1024], *stack_ptr;
-    BOOL fLarge;
-
-    BYTE *win_stack = (BYTE *)CURRENT_STACK16->args;
-
-    lpOutput = (LPSTR) PTR_SEG_TO_LIN(*(DWORD*)win_stack);
-    win_stack += sizeof(DWORD);
-    lpFormat = (LPSTR) PTR_SEG_TO_LIN(*(DWORD*)win_stack);
-    win_stack += sizeof(DWORD);
-
-      /* create 32-bit stack for libc's vsprintf() */
-
-    for (ptr = lpFormat, stack_ptr = new_stack; *ptr; ptr++)
-    {
-        if (*ptr != '%' || *++ptr == '%')
-            continue;
-
-        /* skip width/precision */
-        while (*ptr == '-' || *ptr == '+' || *ptr == '.' ||
-               *ptr == ' ' || isdigit(*ptr) || *ptr == '#')
-            ptr++;
-
-        /* handle modifier */
-        fLarge = ((*ptr == 'l') || (*ptr == 'L'));
-        if (fLarge) ptr++;
-
-        switch (*ptr)
-        {
-        case 's':
-            *(char**)stack_ptr = (char *)PTR_SEG_TO_LIN(*(DWORD*)win_stack);
-            stack_ptr += sizeof(char *);
-            win_stack += sizeof(DWORD);
-            break;
-
-        case 'c':
-	
-/* windows' wsprintf() %c ignores 0's, we replace 0 with SPACE to make sure
-   that the remaining part of the string isn't ignored by the winapp */
-				
-            if (*(WORD*)win_stack)
-                *(DWORD*)stack_ptr = *(WORD*)win_stack;
-            else
-                *(DWORD*)stack_ptr = ' ';
-            stack_ptr += sizeof(DWORD);
-            win_stack += sizeof(WORD);
-            break;
-
-        case 'd':
-        case 'i':
-            if (!fLarge)
-            {
-                *(int*)stack_ptr = *(INT*)win_stack;
-                stack_ptr += sizeof(int);
-                win_stack += sizeof(INT);
-                break;
-            }
-            /* else fall through */
-        case 'u':
-        case 'x':
-        case 'X':
-            if (fLarge)
-            {
-                *(DWORD*)stack_ptr = *(DWORD*)win_stack;
-                win_stack += sizeof(DWORD);
-            }
-            else
-            {
-                *(DWORD*)stack_ptr = *(WORD*)win_stack;
-                win_stack += sizeof(WORD);
-            }
-            stack_ptr += sizeof(DWORD);
-            break;
-
-        default:
-            *(DWORD*)stack_ptr = 0;
-            stack_ptr += sizeof(DWORD);
-            win_stack += sizeof(WORD);
-            fprintf(stderr, "wsprintf: oops, unknown formattype %c used!\n", *ptr);
-            break;
-        }
-    }
-
-    return vsprintf(lpOutput, lpFormat, new_stack);
-}
-#endif
-
-/**************************************************************************
- *                wsprintf        [USER.420] (not used by relay)
- */
-int wsprintf(LPSTR lpOutput, LPSTR lpFormat, ...)
-{
-	va_list valist;
-	int ArgCnt;
-
-	va_start(valist, lpFormat);
-	ArgCnt = vsprintf(lpOutput, lpFormat, valist);
-	va_end(valist);
-
-	return ArgCnt;
-}
-
-
-/*	wvsprintf() is an implementation of vsprintf(). This
- *	implementation converts the arguments to 32-bit integers and
- *	calls the standard library function vsprintf().
- *
- *	Known shortcomings:
- *		wvsprintf() doesn't yet convert the arguments back after
- *		calling vsprintf(), so if Windows implements %n and a
- *		program depends on it, we're in trouble.
- */
-
-int wvsprintf(LPSTR buf, LPSTR format, LPSTR args)
-{
-	char *newargs;
-	int result;
-
-	if(!buf || !format) return 0;
-
-	/* Convert agruments to 32-bit values */
-	newargs = UTILITY_convertArgs(format, args);
-	result = vsprintf(buf, format, newargs);
-
-	free(newargs);
-	return result;
-};
-
diff --git a/windows/win.c b/windows/win.c
index ce2b70a..e9fbaa0 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -15,6 +15,7 @@
 #include "sysmetrics.h"
 #include "cursoricon.h"
 #include "event.h"
+#include "menu.h"
 #include "nonclient.h"
 #include "queue.h"
 #include "winpos.h"
@@ -97,10 +98,10 @@
              ptr->ptIconPos.y, ptr->ptMaxPos.x, ptr->ptMaxPos.y, ptr->hSysMenu,
              ptr->flags, ptr->hProp, ptr->hVScroll, ptr->hHScroll );
 
-    if (ptr->class->wc.cbWndExtra)
+    if (ptr->class->cbWndExtra)
     {
         fprintf( stderr, "extra bytes:" );
-        for (i = 0; i < ptr->class->wc.cbWndExtra; i++)
+        for (i = 0; i < ptr->class->cbWndExtra; i++)
             fprintf( stderr, " %02x", *((BYTE*)ptr->wExtra+i) );
         fprintf( stderr, "\n" );
     }
@@ -324,7 +325,7 @@
     }
     if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
     if (wndPtr->window) XDestroyWindow( display, wndPtr->window );
-    if (wndPtr->class->wc.style & CS_OWNDC) DCE_FreeDCE( wndPtr->hdce );
+    if (wndPtr->class->style & CS_OWNDC) DCE_FreeDCE( wndPtr->hdce );
     wndPtr->class->cWindows--;
     USER_HEAP_FREE( hwnd );
 }
@@ -361,7 +362,7 @@
     if (!(class = CLASS_FindClassByName( DESKTOP_CLASS_ATOM, 0 )))
 	return FALSE;
 
-    hwndDesktop = USER_HEAP_ALLOC( sizeof(WND)+class->wc.cbWndExtra );
+    hwndDesktop = USER_HEAP_ALLOC( sizeof(WND)+class->cbWndExtra );
     if (!hwndDesktop) return FALSE;
     pWndDesktop = (WND *) USER_HEAP_LIN_ADDR( hwndDesktop );
 
@@ -386,7 +387,7 @@
     pWndDesktop->hmemTaskQ         = 0; /* Desktop does not belong to a task */
     pWndDesktop->hrgnUpdate        = 0;
     pWndDesktop->hwndLastActive    = hwndDesktop;
-    pWndDesktop->lpfnWndProc       = class->wc.lpfnWndProc;
+    pWndDesktop->lpfnWndProc       = class->lpfnWndProc;
     pWndDesktop->dwStyle           = WS_VISIBLE | WS_CLIPCHILDREN |
                                      WS_CLIPSIBLINGS;
     pWndDesktop->dwExStyle         = 0;
@@ -398,7 +399,7 @@
     pWndDesktop->flags             = 0;
     pWndDesktop->window            = rootWindow;
     pWndDesktop->hSysMenu          = 0;
-    pWndDesktop->hProp	      = 0;
+    pWndDesktop->hProp             = 0;
     EVENT_RegisterWindow( pWndDesktop->window, hwndDesktop );
     SendMessage( hwndDesktop, WM_NCCREATE, 0, 0 );
     if ((hdc = GetDC( hwndDesktop )) != 0)
@@ -411,23 +412,23 @@
 
 
 /***********************************************************************
- *           CreateWindow   (USER.41)
+ *           CreateWindow16   (USER.41)
  */
-HWND CreateWindow( SEGPTR className, SEGPTR windowName,
-		   DWORD style, INT x, INT y, INT width, INT height,
-		   HWND parent, HMENU menu, HANDLE instance, SEGPTR data ) 
+HWND CreateWindow16( SEGPTR className, SEGPTR windowName,
+                     DWORD style, INT16 x, INT16 y, INT16 width, INT16 height,
+                     HWND parent, HMENU menu, HANDLE instance, SEGPTR data ) 
 {
-    return CreateWindowEx( 0, className, windowName, style,
+    return CreateWindowEx16( 0, className, windowName, style,
 			   x, y, width, height, parent, menu, instance, data );
 }
 
 
 /***********************************************************************
- *           CreateWindowEx   (USER.452)
+ *           CreateWindowEx16   (USER.452)
  */
-HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
-		     DWORD style, INT x, INT y, INT width, INT height,
-		     HWND parent, HMENU menu, HANDLE instance, SEGPTR data ) 
+HWND CreateWindowEx16(DWORD exStyle, SEGPTR className, SEGPTR windowName,
+                      DWORD style, INT16 x, INT16 y, INT16 width, INT16 height,
+                      HWND parent, HMENU menu, HANDLE instance, SEGPTR data ) 
 {
     HANDLE hwnd;
     CLASS *classPtr;
@@ -452,8 +453,8 @@
 		exStyle, style, x, y, width, height,
 		parent, menu, instance, (DWORD)data);
 
-    if (x == CW_USEDEFAULT) x = y = 0;
-    if (width == CW_USEDEFAULT)
+    if (x == CW_USEDEFAULT16) x = y = 0;
+    if (width == CW_USEDEFAULT16)
     {
 	width = 600;
 	height = 400;
@@ -494,7 +495,7 @@
 
       /* Create the window structure */
 
-    hwnd = USER_HEAP_ALLOC( sizeof(WND)+classPtr->wc.cbWndExtra );
+    hwnd = USER_HEAP_ALLOC( sizeof(WND)+classPtr->cbWndExtra );
     if (!hwnd) {
 	dprintf_win(stddeb,"CreateWindowEx: Out of memory\n");
 	return 0;
@@ -519,7 +520,7 @@
     wndPtr->hmemTaskQ      = GetTaskQueue(0);
     wndPtr->hrgnUpdate     = 0;
     wndPtr->hwndLastActive = hwnd;
-    wndPtr->lpfnWndProc    = classPtr->wc.lpfnWndProc;
+    wndPtr->lpfnWndProc    = classPtr->lpfnWndProc;
     wndPtr->dwStyle        = style & ~WS_VISIBLE;
     wndPtr->dwExStyle      = exStyle;
     wndPtr->wIDmenu        = 0;
@@ -527,21 +528,18 @@
     wndPtr->flags          = 0;
     wndPtr->hVScroll       = 0;
     wndPtr->hHScroll       = 0;
-    wndPtr->hSysMenu       = 0;
+    wndPtr->hSysMenu       = MENU_GetDefSysMenu();
     wndPtr->hProp          = 0;
 
-    if (classPtr->wc.cbWndExtra)
-	memset( wndPtr->wExtra, 0, classPtr->wc.cbWndExtra );
+    if (classPtr->cbWndExtra)
+	memset( wndPtr->wExtra, 0, classPtr->cbWndExtra );
     classPtr->cWindows++;
 
       /* Get class or window DC if needed */
 
-    if (classPtr->wc.style & CS_OWNDC)
-        wndPtr->hdce = DCE_AllocDCE( DCE_WINDOW_DC );
-    else if (classPtr->wc.style & CS_CLASSDC)
-        wndPtr->hdce = classPtr->hdce;
-    else
-        wndPtr->hdce = 0;
+    if (classPtr->style & CS_OWNDC) wndPtr->hdce = DCE_AllocDCE(DCE_WINDOW_DC);
+    else if (classPtr->style & CS_CLASSDC) wndPtr->hdce = classPtr->hdce;
+    else wndPtr->hdce = 0;
 
       /* Insert the window in the linked list */
 
@@ -588,7 +586,7 @@
 	}
         win_attr.colormap      = COLOR_WinColormap;
         win_attr.backing_store = Options.backingstore ? WhenMapped : NotUseful;
-        win_attr.save_under    = ((classPtr->wc.style & CS_SAVEBITS) != 0);
+        win_attr.save_under    = ((classPtr->style & CS_SAVEBITS) != 0);
         win_attr.cursor        = CURSORICON_XCursor;
         wndPtr->window = XCreateWindow( display, rootWindow, x, y,
                                         width, height, 0, CopyFromParent,
@@ -612,13 +610,11 @@
     if ((style & WS_CAPTION) && !(style & WS_CHILD))
     {
         if (menu) SetMenu(hwnd, menu);
-        else if (classPtr->wc.lpszMenuName)
-            SetMenu( hwnd, LoadMenu( instance, classPtr->wc.lpszMenuName ) );
+        else if (classPtr->lpszMenuName)
+            SetMenu( hwnd, LoadMenu( instance, classPtr->lpszMenuName ) );
     }
     else wndPtr->wIDmenu = (UINT)menu;
 
-    GetSystemMenu( hwnd, TRUE );  /* Create a copy of the system menu */
-
       /* Send the WM_CREATE message */
 
     createStruct.lpCreateParams = (LPSTR)data;
@@ -643,7 +639,7 @@
     else
     {
 	WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
-			       NULL, NULL, NULL, &wndPtr->rectClient );
+			       NULL, NULL, 0, &wndPtr->rectClient );
 	wmcreate = SendMessage(hwnd, WM_CREATE, 0, (LPARAM)MAKE_SEGPTR(&createStruct));
     }
 
@@ -758,7 +754,14 @@
 /***********************************************************************
  *           FindWindow   (USER.50)
  */
-HWND FindWindow( SEGPTR ClassMatch, LPSTR TitleMatch )
+HWND FindWindow( SEGPTR ClassMatch, LPSTR TitleMatch ) {
+    return FindWindowEx((HWND)0,(HWND)0,ClassMatch,TitleMatch);
+}
+/***********************************************************************
+ *           FindWindowEx   (USER.427)
+ */
+HWND 
+FindWindowEx(HWND parent,HWND childafter,SEGPTR ClassMatch,LPSTR TitleMatch )
 {
     WND *wndPtr;
     CLASS *class = NULL;
@@ -769,7 +772,23 @@
             return 0;
     }
 
-    wndPtr = pWndDesktop->child;
+    if (parent) {
+    	wndPtr = WIN_FindWndPtr(parent);
+    	if (wndPtr == NULL)
+    		wndPtr = pWndDesktop;
+    	wndPtr = wndPtr->child;
+    } else
+	wndPtr = pWndDesktop->child;
+    if (childafter) {
+	while (wndPtr)
+	{
+	    if (childafter == wndPtr->hwndSelf) {
+	    	wndPtr = wndPtr->next;
+	    	break;
+	    }
+	    wndPtr = wndPtr->next;
+	}
+    }
     while (wndPtr)
     {
 	if (!class || (wndPtr->class == class))
@@ -1524,7 +1543,7 @@
  LPDRAGINFO	lpDragInfo;
  SEGPTR		spDragInfo;
  HCURSOR 	hDragCursor=0, hOldCursor=0, hBummer=0;
- HANDLE		hDragInfo  = GlobalAlloc( GMEM_SHARE | GMEM_ZEROINIT, 2*sizeof(DRAGINFO));
+ HANDLE		hDragInfo  = GlobalAlloc16( GMEM_SHARE | GMEM_ZEROINIT, 2*sizeof(DRAGINFO));
  WND           *wndPtr = WIN_FindWndPtr(hWnd);
  DWORD		dwRet = 0;
  short	 	dragDone = 0;
@@ -1532,8 +1551,8 @@
  HWND		hCurrentWnd = 0;
  WORD	        btemp;
 
- lpDragInfo = (LPDRAGINFO) GlobalLock(hDragInfo);
- spDragInfo = (SEGPTR) WIN16_GlobalLock(hDragInfo);
+ lpDragInfo = (LPDRAGINFO) GlobalLock16(hDragInfo);
+ spDragInfo = (SEGPTR) WIN16_GlobalLock16(hDragInfo);
 
  if( !lpDragInfo || !spDragInfo ) return 0L;
 
@@ -1541,7 +1560,7 @@
 
  if( !hBummer || !wndPtr )
    {
-        GlobalFree(hDragInfo);
+        GlobalFree16(hDragInfo);
         return 0L;
    }
 
@@ -1549,7 +1568,7 @@
    {
 	if( !(hDragCursor = CURSORICON_IconToCursor(hCursor)) )
 	  {
-	   GlobalFree(hDragInfo);
+	   GlobalFree16(hDragInfo);
 	   return 0L;
 	  }
 
@@ -1632,7 +1651,7 @@
  if( hCurrentCursor != hBummer ) 
 	dwRet = SendMessage( lpDragInfo->hScope, WM_DROPOBJECT, 
 			     (WPARAM)hWnd, (LPARAM)spDragInfo );
- GlobalFree(hDragInfo);
+ GlobalFree16(hDragInfo);
 
  return dwRet;
 }
diff --git a/windows/winpos.c b/windows/winpos.c
index 9e7f073..e059ef0 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -855,7 +855,7 @@
  */
 LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect, RECT *newWindowRect,
 			    RECT *oldWindowRect, RECT *oldClientRect,
-			    WINDOWPOS *winpos, RECT *newClientRect )
+			    SEGPTR winpos, RECT *newClientRect )
 {
     NCCALCSIZE_PARAMS params;
     LONG result;
@@ -1337,7 +1337,7 @@
       {
          result = WINPOS_SendNCCalcSize( winpos.hwnd, TRUE, &newWindowRect,
 				    &wndPtr->rectWindow, &wndPtr->rectClient,
-				    &winpos, &newClientRect );
+				    MAKE_SEGPTR(&winpos), &newClientRect );
 
          /* FIXME: WVR_ALIGNxxx */