diff --git a/ANNOUNCE b/ANNOUNCE
index e19ef72..a486e16 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,14 +1,14 @@
-This is release 951105 of Wine the MS Windows emulator.  This is still a
+This is release 951124 of Wine the MS Windows emulator.  This is still a
 developer's only release.  There are many bugs and many unimplemented API
 features.  Most applications still do not work.
 
 Patches should be submitted to "wine-new@amscons.com".  Please don't forget
 to include a ChangeLog entry.  I'll make a new release every other week.
 
-WHAT'S NEW with Wine-951105: (see ChangeLog for details)
-	- A lot of fixes for Winelib.
-	- Built-in debugger improvements.
-	- Get/SetMetafileBits implemented.
+WHAT'S NEW with Wine-951124: (see ChangeLog for details)
+	- Drag and drop implemented.
+	- Unixware is now fully supported.
+	- Many Win32 improvements.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -17,11 +17,11 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951105.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951105.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951105.tar.gz
-    ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-951105.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-951105.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951124.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951124.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951124.tar.gz
+    ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-951124.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-951124.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/BUGS b/BUGS
index d0f6e47..19f3c08 100644
--- a/BUGS
+++ b/BUGS
@@ -1,9 +1,27 @@
+1. 32-bit/16-bit call translation:
+
 - EBP and ESP are sometimes corrupted while running 16-bit code.
-- Message flow is not correct for multiple tasks, some messages are not supported.
+
+2. Messaging:
+
+- Message flow is not correct for multiple tasks
 - Dialog Boxes created by WM_CREATE handler aren't visible
 - MDI does not send WM_GETMINMAX message.
+- resizing of MDI child windows sometimes leaves them unrepainted
+
+3. Controls:
+
+- Some features are missing (like VK_SHIFT aided multiple selection in listboxes)
+
+4. Miscellaneous:
+
 - InitializeLoadedDLLs() can't init LZEXPAND.DLL. (cs:ip => 0:0)
 - LoadCursor does not correctly handle bitmap cursors
 - AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple times.
 - Dialogs don't support resources which are referred to as integers.
+
+5. Where to look in source files:
+
 - grep for FIXME in the source files.
+
+
diff --git a/ChangeLog b/ChangeLog
index 988d9a6..9fcdf03 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,215 @@
 ----------------------------------------------------------------------
+Tue Nov 21 18:49:10 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>
+
+	* [configure.in] [Makefile] [misc/dos_fs.c]
+	Got rid of autoconf.h file.
+
+	* [debugger/dbg.y]
+	More logical behavior upon syntax errors.
+
+	* [include/hook.h] [windows/hook.c]
+	Changed hook structure and rewrote most of the hook functions for
+	better compatibility, based on investigations by Alex Korobka.
+
+	* [include/message.h] [windows/message.c]
+	Added hooks to message queue structure and made the structure
+	layout Windows-compatible.
+	Added support for WH_MOUSE, WH_KEYBOARD, WH_HARDWARE and
+	WH_JOURNALRECORD hooks.
+
+	* [misc/main.c]
+	Added command-line option for changing the language at run-time
+ 	(not implemented yet), based on a suggestion from Michael Patra.
+
+	* [objects/cursoricon.c]
+	Fixed silly SEGPTR bug in DumpIcon().
+
+Mon Nov 20 22:22:22 1995  Alex Korobka <alex@phm30.pharm.sunysb.edu>
+
+	* [controls/listbox.c] [controls/combo.c] [include/listbox.h]
+	Partial implementaion of LBS_EXTENDEDSEL style,
+	yet more updates for drag & drop support. Now works.
+
+	* [windows/defwnd.c]
+	More message handlers.
+
+	* [windows/win.c]
+	DragObject, DragDetect, AnyPopup functions. 
+
+	* [controls/listbox.c]
+	More kludgy fixes (WM_...TOITEM, etc.).
+
+	* [objects/cursoricon.c] [objects/oembitmap.c]
+	IconToCursor skeleton, patch for OBM_LoadCursorIcon to handle new
+	cursor.
+
+	* [include/bitmaps/ocr*]
+	New OEM cursors.
+
+Mon Nov 20 11:05:20 EST 1995  Jim Peterson <jspeter@birch.ee.vt.edu>
+
+	* [toolkit/heap.c]
+	Swapped flags and size arguments to LocalRealloc as per changes in
+	memory/local.c by William Magro in previous release.
+
+	* [include/wintypes.h]
+	Reinstated the #define's for 'min' and 'max', since they're part of
+	the Windows API.  I really don't think it's a wise idea, so I put
+	a '#ifndef DONT_DEFINE_min_AND_max' around them.  I think the actual
+	WINE code should never use these (it should use 'MIN' and 'MAX'
+	instead).
+
+	* [loader/*]
+	Put '#ifndef WINELIB' around many things that WINElib should not need.
+
+	* [controls/edit.c]
+	Took out many '#if defined(WINELIB)' sections with the associated
+	comment 'temporary fix, until Local memory is correctly implemented in
+	WINELIB', since the effective translations are now in 
+	toolkit/miscstubs.c.
+	Took out the #ifndef's I put in EDIT_ClearText.  Whoever modified this
+	file fixed (or at least postponed) the bug I had encountered.
+
+	* [loader/task.c]
+	Put an #ifdef in TASK_CreateTask() that hardwires the current drive to
+	C:  This will probably cause a lot of trouble if this change is
+	forgotten in the future, but it will let things like the OpenFileName
+	dialog work for now.
+
+	* [toolkit/libres.c] [toolkit/Makefile.in] [toolkit/Makefile]
+	  [include/libres.h]
+	Made new libres.c file, which will contain functions for supporting
+	accessing resources by name in WINElib.  'winerc' will need to be
+	changed.
+
+	* [toolkit/heap.c]
+	Refined memory routines to allow for differences between LocalAlloc
+	and GlobalAlloc and between LocalSize and GlobalSize.
+
+	* [windows/message.c] [include/windows.h]
+	Defined the GetCurrentTime routine in windows/message.c, and removed
+	the #define in windows.h.
+
+Mon Nov 20 00:36:42 MET 1995 Sven Verdoolaege <skimo@dns.ufsia.ac.be>
+
+	* [*/*]
+	Added new debugging type DEBUG_WIN32 and DEBUG_ENV.
+
+	* [loader/module.c]
+	Added undocumented GetExpWinVer.
+
+	* [tools/build.c]
+	Previous code didn't pop possibly changed %esi, %edi and %edx
+	from the stack.
+	
+	* [win32/advapi.c]
+	Added GetUserNameA.
+
+	* [win32/code_page.c]
+	Added stub for MultiByteToWideChar.
+
+	* [win32/console.c]
+	Added SetConsoleCtrlHandler stub.
+
+	* [win32/file.c]
+	Added ReadFile CreateFileA GetFileInformationByHandle stubs.
+	Added CloseHandle.
+
+	* [win32/memory.c]
+	Changed VirtualAlloc and VirtualFree.
+
+	* [win32/process.c]
+	Added ExitProcess.
+
+Sun Nov 19 17:54:42 1995   Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
+
+	* [include/windows.h]
+	Fixed a few broken structure definitions.
+
+	* [loader/resource.c]
+	FindResource(): Need to check for '#xxx' strings here.
+
+	* [miscemu/int21.c]
+	FindNext(): Return MS-DOS filenames uppercase.
+
+	* [objects/cursoricon.c]
+	CreateIcon(), CreateCursor(): Added missing element to CURSORICONINFO
+	initializers.
+	
+	* [misc/file.c]
+	_lopen(): Files opened in OF_WRITE mode are truncated.
+	OpenFile(): Ignore OF_READ/OF_WRITE/OF_READWRITE when files are
+	created; use read/write mode.
+	
+	* [misc/profile.c]
+	load(): Rewritten.
+	
+	* [misc/commdlg.c]
+	Fixed bad call to strncpy() that smashed the stack.
+
+	* [controls/combo.c] [windows/winpos.c] [memory/selector.c]
+	Operator precedence fixes. People who use gcc 2.7.1 don't need a
+	debugger :-)
+	
+	* [if1632/gdi.spec] [objects/palette.c]
+	Add ResizePalette() and AnimatePalette() stubs. They don't do anything,
+	but sometimes that's good enough.
+
+Fri Nov 17 09:10:35 GMT 1995  John Harvey <john@division.co.uk>
+
+	* [include/wine.h] [include/registers.h] [include/winsock.h]
+        Added definitions for Unixware.
+
+	* [loader/signal.c] [misc/comm.c] [misc/winsocket.c]
+	Misc. fixes for Unixware.
+
+	* [loader/task.c]
+        Made assignemts to context in InitTask for registers use the macros
+        from registers.h to make them more portable. (Needed for Unixware)
+
+	* [tools/build.c]
+	Fixed register acces routines to work on Unixware. Bit grubby but
+ 	it seems to work.
+
+	* [controls/edit.c]
+	EDIT_WM_NCCreate allocates local heap if hasn't been previously
+	allocated.
+	
+	* [miscemu/int21.c]
+	mkdir now creates directory with permission to access it.
+
+	* [misc/dos_fs.c]
+	mkdir now creates directory with permission to access it.
+	DOS_opendir now uses linked list of dirents to avoid problems with 
+	realloc changing address of malloced memory.
+
+Thu Nov 16 12:47:13 1995  Michael Patra  <patra@itp1.Physik.TU-Berlin.DE>
+
+	* [controls/menu.c]
+	MENU_CalcItemSize(): Fixed handling of empty menu items.
+
+Sat Nov 11 21:46:54 1995  Hans de Graaff  <graaff@twi72.twi.tudelft.nl>
+
+	* [misc/file.c]
+	In OpenFile, unlink should be done on the unix filename.
+
+Sat Nov 11 16:43:29 1995  Cameron Heide  (heide@ee.ualberta.ca)
+
+        * [include/handle32.h]
+        New header file containing internal Win32 kernel handle
+        information.
+
+        * [win32/file.c]
+        Added ReadFile, CreateFile, and CloseFileHandle, and did
+        some reorganizing to match the new handle allocation scheme.
+
+        * [win32/init.c]
+        Added CloseHandle and the creation of standard I/O handles.
+
+        * [win32/object_mgt.c]
+        New module for allocating and freeing Win32 kernel handles.
+
+----------------------------------------------------------------------
 Fri Nov  3 20:08:17 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>
 
 	* [configure.in]
diff --git a/Makefile.in b/Makefile.in
index 19f8a12..e7a7bb9 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -84,8 +84,6 @@
 
 distclean:
 	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) distclean); done
-	echo "/* autoconf.h generated automatically.  Run Configure */" >autoconf.h
-	echo "#error You must run Configure before you can build the makefiles." >>autoconf.h
 	$(RM) *.o \#*\# *~ *.bak wine wine.sym winelib.a TAGS
 	$(RM) config.* include/config.h Make.rules Makefile
 
diff --git a/autoconf.h b/autoconf.h
deleted file mode 100644
index 9cb370e..0000000
--- a/autoconf.h
+++ /dev/null
@@ -1,2 +0,0 @@
-/* autoconf.h generated automatically.  Run Configure */
-#error You must run Configure before you can build the makefiles.
diff --git a/autoconf.h.in b/autoconf.h.in
deleted file mode 100644
index 9c92cf4..0000000
--- a/autoconf.h.in
+++ /dev/null
@@ -1,3 +0,0 @@
-/* @configure_input@ */
-#define WINE_INI_GLOBAL @WINE_INI_GLOBAL@
-#define AutoDefines @LANG@
diff --git a/configure b/configure
index c0df84d..3223ea7 100755
--- a/configure
+++ b/configure
@@ -1596,18 +1596,6 @@
 TOP_SRCDIR="${top_srcdir}"
 fi
 
-echo $ac_n "checking for wine.ini in autoconf.h""... $ac_c" 1>&6
-if test -f ${TOP_SRCDIR}/autoconf.h; then
-if test `grep -c WINE_INI_GLOBAL ${TOP_SRCDIR}/autoconf.h` -ne 0; then
-WINE_INI_GLOBAL=`grep WINE_INI_GLOBAL ${TOP_SRCDIR}/autoconf.h | tr ' ' '\n' | tail -1`
-echo "$ac_t""${WINE_INI_GLOBAL}" 1>&6
-fi
-fi
-if test -z "${WINE_INI_GLOBAL}"; then
-echo "$ac_t""no" 1>&6
-fi
-
-if test -z "${WINE_INI_GLOBAL}"; then
 echo $ac_n "checking for /usr/local/etc/wine.conf""... $ac_c" 1>&6
 if test -f /usr/local/etc/wine.conf; then
 echo "$ac_t""yes" 1>&6
@@ -1616,7 +1604,6 @@
 echo "$ac_t""no" 1>&6
 WINE_INI_GLOBAL="\"${TOP_SRCDIR}/wine.ini\""
 fi
-fi
 
 cat >> confdefs.h <<EOF
 #define WINE_INI_GLOBAL $WINE_INI_GLOBAL
diff --git a/configure.in b/configure.in
index 4bbf3fe..7eee842 100644
--- a/configure.in
+++ b/configure.in
@@ -55,18 +55,6 @@
 TOP_SRCDIR="${top_srcdir}"
 fi
 
-AC_MSG_CHECKING(for wine.ini in autoconf.h)
-if test -f ${TOP_SRCDIR}/autoconf.h; then
-if test `grep -c WINE_INI_GLOBAL ${TOP_SRCDIR}/autoconf.h` -ne 0; then
-WINE_INI_GLOBAL=`grep WINE_INI_GLOBAL ${TOP_SRCDIR}/autoconf.h | tr ' ' '\n' | tail -1`
-AC_MSG_RESULT(${WINE_INI_GLOBAL})
-fi
-fi
-if test -z "${WINE_INI_GLOBAL}"; then
-AC_MSG_RESULT(no)
-fi
-
-if test -z "${WINE_INI_GLOBAL}"; then
 AC_MSG_CHECKING(for /usr/local/etc/wine.conf)
 if test -f /usr/local/etc/wine.conf; then
 AC_MSG_RESULT(yes)
@@ -75,7 +63,6 @@
 AC_MSG_RESULT(no)
 WINE_INI_GLOBAL="\"${TOP_SRCDIR}/wine.ini\""
 fi
-fi
 AC_SUBST(WINE_INI_GLOBAL)
 AC_DEFINE_UNQUOTED(WINE_INI_GLOBAL,$WINE_INI_GLOBAL)
 
diff --git a/controls/combo.c b/controls/combo.c
index 8284d51..bed192e 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -148,7 +148,7 @@
 				  0, 0, lphc->RectButton.left, lphl->StdItemHeight,
 				  hwnd, (HMENU)1, WIN_GetWindowInstance(hwnd), 0L);
     break;
-   case CBS_DROPDOWNLIST:      /* static control, downdown listbox   */
+   case CBS_DROPDOWNLIST:      /* static control, dropdown listbox   */
     dprintf_combo(stddeb,"CBS_DROPDOWNLIST\n");
     lphc->RectButton = rect;
     lphc->RectButton.left = lphc->RectButton.right - 6 - CBitWidth;
@@ -299,7 +299,7 @@
     newFocused = lphl->ItemsCount - 1;
   
   ListBoxSetCurSel(lphl, newFocused);
-  ListBoxSendNotification(lphl, hwnd, CBN_SELCHANGE);
+  ListBoxSendNotification(lphl, CBN_SELCHANGE);
 
   lphl->ItemFocused = newFocused;
   ListBoxScrollToFocus(lphl);
@@ -324,7 +324,7 @@
     newFocused = lphl->ItemsCount - 1;
   
   ListBoxSetCurSel(lphl, newFocused);
-  ListBoxSendNotification(lphl, hwnd, CBN_SELCHANGE);
+  ListBoxSendNotification(lphl, CBN_SELCHANGE);
   lphl->ItemFocused = newFocused;
   ListBoxScrollToFocus(lphl);
   
@@ -577,7 +577,7 @@
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
   RECT rect;
   
-  if (lphc->dwStyle & 3 == CBS_SIMPLE) return LB_ERR;
+  if ((lphc->dwStyle & 3) == CBS_SIMPLE) return LB_ERR;
   
   wParam = !!wParam;
   if (wParam != lphc->DropDownVisible) {
@@ -708,7 +708,7 @@
     newFocused = lphl->ItemsCount - 1;
   
   ListBoxSetCurSel(lphl, newFocused);
-  ListBoxSendNotification(lphl, hwnd, CBN_SELCHANGE);
+  ListBoxSendNotification(lphl, CBN_SELCHANGE);
 
   lphl->ItemFocused = newFocused;
   ListBoxScrollToFocus(lphl);
@@ -862,7 +862,7 @@
   else if (lphl->PrevFocused != lphl->ItemFocused) 
           {
       		SendMessage(CLBoxGetCombo(hwnd),CB_SETCURSEL,lphl->ItemFocused,0);
-      		ListBoxSendNotification(lphl, CLBoxGetCombo(hwnd), CBN_SELCHANGE);
+      		ListBoxSendNotification(lphl, CBN_SELCHANGE);
      	  }
 
   SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
diff --git a/controls/edit.c b/controls/edit.c
index 31534d6..04383fb 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -11,6 +11,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <windows.h>
+#include "instance.h"
 #include "local.h"
 #include "win.h"
 #include "class.h"
@@ -106,13 +107,8 @@
 static HLOCAL EDIT_HeapAlloc(HWND hwnd, int bytes, WORD flags)
 {
     HLOCAL ret;
-
-#if defined(WINELIB)
-    /* temporary fix, until Local memory is correctly implemented in WINELIB */
-    ret = LocalAlloc( flags, bytes );
-#else
+    
     ret = LOCAL_Alloc( WIN_GetWindowInstance(hwnd), flags, bytes );
-#endif
     if (!ret)
         printf("EDIT_HeapAlloc: Out of heap-memory\n");
     return ret;
@@ -126,11 +122,11 @@
 static void *EDIT_HeapLock(HWND hwnd, HANDLE handle)
 {
     HINSTANCE hinstance = WIN_GetWindowInstance( hwnd );
+#if defined(WINELIB)
+    return LOCAL_Lock( hinstance, handle );
+#else
     HANDLE offs;
     
-#if defined(WINELIB)
-    return handle;
-#else
     if (handle == 0) return 0;
     offs = LOCAL_Lock( hinstance, handle );
     return PTR_SEG_OFF_TO_LIN( hinstance, offs );
@@ -142,12 +138,8 @@
  */
 static void EDIT_HeapUnlock(HWND hwnd, HANDLE handle)
 {
-#if defined(WINELIB)
-    return 0;
-#else
     if (handle == 0) return;
     LOCAL_Unlock( WIN_GetWindowInstance( hwnd ), handle );
-#endif
 }
 
 /*********************************************************************
@@ -157,12 +149,8 @@
  */
 static HLOCAL EDIT_HeapReAlloc(HWND hwnd, HANDLE handle, int bytes)
 {
-#if defined(WINELIB)
-    return LocalReAlloc( handle, bytes, LMEM_FIXED );
-#else
     return LOCAL_ReAlloc( WIN_GetWindowInstance(hwnd), handle, bytes, 
 			  LMEM_FIXED );
-#endif
 }
 
 
@@ -173,11 +161,7 @@
  */
 static void EDIT_HeapFree(HWND hwnd, HANDLE handle)
 {
-#if defined(WINELIB)
-    LocalFree( handle );
-#else
     LOCAL_Free( WIN_GetWindowInstance(hwnd), handle );
-#endif
 }
 
 
@@ -188,11 +172,7 @@
  */
 static unsigned int EDIT_HeapSize(HWND hwnd, HANDLE handle)
 {
-#if defined(WINELIB)
-    return LocalSize( handle );
-#else
     return LOCAL_Size( WIN_GetWindowInstance(hwnd), handle );
-#endif
 }
 
 /********************************************************************
@@ -264,7 +244,7 @@
 {
     EDITSTATE *es = EDIT_GetEditState(hwnd);
     
-    dprintf_edit( stddeb, "EDIT_ClerTextPointers\n" );
+    dprintf_edit( stddeb, "EDIT_ClearTextPointers\n" );
     es->textptrs = xrealloc(es->textptrs, sizeof(int));
     es->textptrs[0] = 0;
 }
@@ -1315,11 +1295,11 @@
     char *text;
 
     dprintf_edit(stddeb,"EDIT_ClearText %d\n",blen);
-#ifndef WINELIB
+/*#ifndef WINELIB*/
     es->hText = EDIT_HeapReAlloc(hwnd, es->hText, blen);
     text = EDIT_HeapLock(hwnd, es->hText);
     memset(text, 0, blen);
-#endif
+/*#endif*/
     es->textlen = 0;
     es->wlines = 0;
     es->CurrLine = es->CurrCol = 0;
@@ -1327,9 +1307,9 @@
     es->wleft = es->wtop = 0;
     es->textwidth = 0;
     es->TextChanged = FALSE;
-#ifndef WINELIB
+/*#ifndef WINELIB*/
     EDIT_ClearTextPointers(hwnd);
-#endif
+/*#endif*/
 }
 
 /*********************************************************************
@@ -2230,6 +2210,13 @@
     EndPaint(hwnd, &ps);
 }
 
+static BOOL LOCAL_HeapExists(WORD ds)
+{
+    INSTANCEDATA *ptr = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN( ds, 0 );
+    if (!ptr->heap) return 0;
+    return 1;
+}
+
 /*********************************************************************
  *  WM_NCCREATE
  */
@@ -2238,11 +2225,11 @@
     CREATESTRUCT *createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
     WND *wndPtr = WIN_FindWndPtr(hwnd);
     EDITSTATE *es;
-    char *text;
+    char *text = NULL;
+    HANDLE ds;
 
     /* store pointer to local or global heap in window structure so that */
     /* EDITSTATE structure itself can be stored on local heap  */
-
     /* allocate space for state variable structure */
     es = xmalloc( sizeof(EDITSTATE) );
     SetWindowLong( hwnd, 0, (LONG)es );
@@ -2251,6 +2238,33 @@
     es->ClientWidth = es->ClientHeight = 1;
     /* --- text buffer */
     es->MaxTextLen = MAXTEXTLEN + 1;
+    /*
+     * Hack - If there is no local heap then hwnd should be a globalHeap block
+     * and the local heap needs to be initilised to the same size(minus something)
+     * as the global block
+     */
+    ds = WIN_GetWindowInstance(hwnd);
+    
+    if (!LOCAL_HeapExists(ds))
+    {
+        DWORD globalSize;
+        globalSize = GlobalSize(ds);
+        printf("No local heap allocated global size is %d 0x%x\n",globalSize, globalSize);
+        /*
+         * I assume the local heap should start at 0 
+         */
+        LocalInit(ds, 0, globalSize);
+        /*
+         * Apparantly we should do an UnlockSegment here but i think this
+         * is because LocalInit is supposed to do a LockSegment. Since
+         * Local Init doesn't do this then it doesn't seem like a good idea to do the
+         * UnlockSegment here yet!
+         * UnlockSegment(hwnd);
+         */
+        
+    }
+    
+
     if (!(createStruct->lpszName))
     {
 	dprintf_edit( stddeb, "EDIT_WM_NCCREATE: lpszName == 0\n" );
@@ -2268,16 +2282,23 @@
     {
         char *windowName = (char *)PTR_SEG_TO_LIN( createStruct->lpszName );
 	dprintf_edit( stddeb, "EDIT_WM_NCCREATE: lpszName != 0\n" );
+        
 	if (strlen(windowName) < EditBufStartLen(hwnd))
 	{
 	    es->textlen = EditBufStartLen(hwnd) + 3;
 	    es->hText = EDIT_HeapAlloc(hwnd, es->textlen + 2, LMEM_MOVEABLE);
-	    text = EDIT_HeapLock(hwnd, es->hText);
-	    strcpy(text, windowName);
-	    if(IsMultiLine(hwnd)) {
-		strcat(text, "\r\n");
-	    }
-	    *(text + es->textlen) = '\0';
+            if (es->hText)
+            {
+                text = EDIT_HeapLock(hwnd, es->hText);
+                if (text)
+                {
+                    strcpy(text, windowName);
+                    if(IsMultiLine(hwnd)) {
+                        strcat(text, "\r\n");
+                    }
+                    *(text + es->textlen) = '\0';
+                }
+            }
 	}
 	else
 	{
@@ -2288,8 +2309,11 @@
 	    if(IsMultiLine(hwnd)) strcat(text, "\r\n");
 	    *(text + es->textlen) = '\0';
 	}
-	*(text + es->textlen + 1) = '\0';
-	EDIT_BuildTextPointers(hwnd);
+        if (text)
+        {
+            *(text + es->textlen + 1) = '\0';
+            EDIT_BuildTextPointers(hwnd);
+        }
     }
 
     /* ES_AUTOVSCROLL and ES_AUTOHSCROLL are automatically applied if */
diff --git a/controls/listbox.c b/controls/listbox.c
index d06760d..a215ec3 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -2,14 +2,16 @@
  * Listbox controls
  * 
  * Copyright  Martin Ayotte, 1993
- * Copyright  Constantine Sapuntzakis, 1995
+ *            Constantine Sapuntzakis, 1995
+ * 	      Alex Korobka, 1995 
  * 
  */
 
  /*
-  * TODO: 
+  * FIXME: 
   * - check if multi-column listboxes work
-  * - implement more messages and styles
+  * - implement more messages and styles (LB_EXTENDEDSEL for instance)
+  * - exterminate evil InvalidateRect(whole listbox) where possible!!!!
   */
 
 #include <stdio.h>
@@ -33,10 +35,26 @@
     ((void *)((handle) ? ((handle) | ((int)lphl->Heap & 0xffff0000)) : 0))
 #else
 /* FIXME: shouldn't each listbox have its own heap? */
+#if 0
 #define LIST_HEAP_ALLOC(lphl,f,size) USER_HEAP_ALLOC(size)
 #define LIST_HEAP_FREE(lphl,handle)  USER_HEAP_FREE(handle)
 #define LIST_HEAP_ADDR(lphl,handle)  USER_HEAP_LIN_ADDR(handle)
 #define LIST_HEAP_SEG_ADDR(lphl,handle) USER_HEAP_SEG_ADDR(handle)
+#else
+/* Something like this maybe ? */
+#define LIST_HEAP_ALLOC(lphl,f,size) \
+            LOCAL_Alloc( lphl->HeapSel, LMEM_FIXED, (size) )
+#if 0
+#define LIST_HEAP_REALLOC(handle,size) \
+            LOCAL_ReAlloc( USER_HeapSel, (handle), (size), LMEM_FIXED )
+#endif
+#define LIST_HEAP_FREE(lphl,handle) \
+            LOCAL_Free( lphl->HeapSel, (handle) )
+#define LIST_HEAP_ADDR(lphl,handle)  \
+            ((handle) ? PTR_SEG_OFF_TO_LIN(lphl->HeapSel, (handle)) : NULL)
+#define LIST_HEAP_SEG_ADDR(lphl,handle)  \
+            ((handle) ? MAKELONG((handle), lphl->HeapSel) : 0)
+#endif
 #endif
 
 #define LIST_HEAP_SIZE 0x10000
@@ -66,9 +84,9 @@
   lphl->iNumStops      = 0;
   lphl->TabStops       = NULL;
   lphl->hFont          = GetStockObject(SYSTEM_FONT);
+  lphl->hSelf          = hwnd;  
   lphl->hParent        = parent;
   lphl->StdItemHeight  = 15; /* FIXME: should get the font height */
-  lphl->dwStyle        = styles;
   lphl->OwnerDrawn     = styles & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
   lphl->HasStrings     = (styles & LBS_HASSTRINGS) || !lphl->OwnerDrawn;
 
@@ -93,6 +111,8 @@
   HeapBase = GlobalLock(HeapHandle);
   HEAP_Init(&lphl->Heap, HeapBase, LIST_HEAP_SIZE);
 #endif
+  lphl->HeapSel = GlobalAlloc(GMEM_FIXED,LIST_HEAP_SIZE);
+  LocalInit( lphl->HeapSel, 0, LIST_HEAP_SIZE-1);
 }
 
 void DestroyListBoxStruct(LPHEADLIST lphl)
@@ -101,6 +121,7 @@
     USER_HEAP_FREE(lphl->hDrawItemStruct);
 
   /* XXX need to free lphl->Heap */
+  GlobalFree(lphl->HeapSel);
   free(lphl);
 }
 
@@ -111,15 +132,17 @@
 
 /* Send notification "code" as part of a WM_COMMAND-message if hwnd
    has the LBS_NOTIFY style */
-void ListBoxSendNotification(LPHEADLIST lphl, HWND hwnd, WORD code)
+void ListBoxSendNotification(LPHEADLIST lphl, WORD code)
 {
-  if (lphl->dwStyle & LBS_NOTIFY)
+  DWORD dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
+
+  if (dwStyle & LBS_NOTIFY)
 #ifdef WINELIB32
     SendMessage(lphl->hParent, WM_COMMAND,
-		MAKEWPARAM(lphl->CtlID,code), (LPARAM)hwnd);
+		MAKEWPARAM(lphl->CtlID,code), (LPARAM)lphl->hSelf);
 #else
     SendMessage(lphl->hParent, WM_COMMAND,
-		lphl->CtlID, MAKELONG(hwnd, code));
+		lphl->CtlID, MAKELONG(lphl->hSelf, code));
 #endif
 }
 
@@ -191,6 +214,8 @@
 void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls, 
 		      RECT *rect, WORD itemAction, WORD itemState)
 {
+  LONG dwStyle = GetWindowLong(hwnd,GWL_STYLE);
+
   if (lphl->OwnerDrawn) {
     DRAWITEMSTRUCT   *dis = USER_HEAP_LIN_ADDR(lphl->hDrawItemStruct);
 
@@ -217,7 +242,7 @@
 	FillRect(hdc, rect, GetStockObject(BLACK_BRUSH));
       }
 
-      if (lphl->dwStyle & LBS_USETABSTOPS) {
+      if (dwStyle & LBS_USETABSTOPS) {
 	TabbedTextOut(hdc, rect->left + 5, rect->top + 2, 
 		      (char *)lpls->itemText, strlen((char *)lpls->itemText), 
 		      lphl->iNumStops, lphl->TabStops, 0);
@@ -269,7 +294,7 @@
   MEASUREITEMSTRUCT *lpmeasure = (MEASUREITEMSTRUCT *) USER_HEAP_LIN_ADDR(hTemp);
 
   if (lpmeasure == NULL) {
-    fprintf(stderr,"ListBoxAskMeasure() out of memory !\n");
+    fprintf(stdnimp,"ListBoxAskMeasure() out of memory !\n");
     return;
   }
  
@@ -277,7 +302,7 @@
   lpmeasure->itemHeight = lphl->StdItemHeight;
   SendMessage(lphl->hParent, WM_MEASUREITEM, 0, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
 
-  if (lphl->dwStyle & LBS_OWNERDRAWFIXED) {
+  if (GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_OWNERDRAWFIXED) {
     lphl->StdItemHeight = lpmeasure->itemHeight;
     lphl->needMeasure = FALSE;
   }
@@ -285,6 +310,7 @@
   USER_HEAP_FREE(hTemp);			
 }
 
+/* -------------------- strings and item data ---------------------- */
 
 LPLISTSTRUCT ListBoxCreateItem(LPHEADLIST lphl, int id)
 {
@@ -314,6 +340,8 @@
     
   dprintf_listbox(stddeb,"ListBoxInsertString(%d, %p);\n", uIndex, newstr);
     
+  if (!newstr) return -1;
+
   if (uIndex == (UINT)-1)
     uIndex = lphl->ItemsCount;
 
@@ -326,7 +354,7 @@
   lplsnew = ListBoxCreateItem(lphl, Count);
   
   if (lplsnew == NULL) {
-    printf("ListBoxInsertString() out of memory !\n");
+    fprintf(stdnimp,"ListBoxInsertString() out of memory !\n");
     return LB_ERRSPACE;
   }
 
@@ -368,9 +396,10 @@
 
 int ListBoxAddString(LPHEADLIST lphl, LPSTR newstr)
 {
+    LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
     UINT pos = (UINT) -1;
     
-    if (lphl->HasStrings && (lphl->dwStyle & LBS_SORT)) {
+    if (lphl->HasStrings && (dwStyle & LBS_SORT)) {
 	LPLISTSTRUCT lpls = lphl->lpFirst;
 	for (pos = 0; lpls != NULL; lpls = lpls->lpNext, pos++)
 	    if (strcmp(lpls->itemText, newstr) >= 0)
@@ -465,6 +494,7 @@
   UINT	       Count;
   UINT         First = nFirst + 1;
   LPSTR        lpMatchStr = (LPSTR)MatchStr;
+  LONG	       dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
 
   if (First > lphl->ItemsCount) return LB_ERR;
 
@@ -475,7 +505,7 @@
   while(lpls != NULL) {
     if (lphl->HasStrings) {
       if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
-    } else if (lphl->dwStyle & LBS_SORT) {
+    } else if (dwStyle & LBS_SORT) {
       /* XXX Do a compare item */
     }
     else
@@ -492,7 +522,7 @@
   while (Count < First) {
     if (lphl->HasStrings) {
       if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
-    } else if (lphl->dwStyle & LBS_SORT) {
+    } else if (dwStyle & LBS_SORT) {
       /* XXX Do a compare item */
     } else {
       if (lpls->mis.itemData == (DWORD)lpMatchStr) return Count;
@@ -528,13 +558,21 @@
     return TRUE;
 }
 
+/* --------------------- selection ------------------------- */
 
 int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex)
 {
   LPLISTSTRUCT lpls;
+  DWORD	       dwStyle = GetWindowWord(lphl->hSelf,GWL_STYLE);
 
-  if (lphl->dwStyle & LBS_MULTIPLESEL) return 0;
+  /* use ListBoxSetSel instead */
+  if (dwStyle & LBS_MULTIPLESEL ) return 0;
 
+  /* unselect all previously selected */
+  if (dwStyle & LBS_EXTENDEDSEL )
+      ListBoxSetSel(lphl,-1,0);
+  else 
+      /* unselect previous item */
   if (lphl->ItemFocused != -1) {
     lpls = ListBoxGetItem(lphl, lphl->ItemFocused);
     if (lpls == 0) return LB_ERR;
@@ -558,7 +596,9 @@
 {
   LPLISTSTRUCT lpls;
 
-  if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return 0;
+  if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & 
+       (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)  )) 
+        return 0;
 
   if (wIndex == (UINT)-1) {
     for (lpls = lphl->lpFirst; lpls != NULL; lpls = lpls->lpNext) {
@@ -584,6 +624,7 @@
   return lpls->itemState;
 }
 
+/* ------------------------- dir listing ------------------------ */
 
 int ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPSTR filespec)
 {
@@ -648,6 +689,7 @@
   return 1;
 }
 
+/* ------------------------- dimensions ------------------------- */
 
 int ListBoxGetItemRect(LPHEADLIST lphl, WORD wIndex, LPRECT lprect)
 {
@@ -663,7 +705,7 @@
 {
   LPLISTSTRUCT lpls;
 
-  if (!(lphl->dwStyle & LBS_OWNERDRAWVARIABLE)) {
+  if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_OWNERDRAWVARIABLE)) {
     lphl->StdItemHeight = (short)height;
     return 0;
   }
@@ -675,6 +717,7 @@
   return 0;
 }
 
+/* -------------------------- string search ------------------------ */  
 
 int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar)
 {
@@ -706,11 +749,13 @@
 static LONG LBCreate(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl;
+  LONG	       dwStyle = GetWindowLong(hwnd,GWL_STYLE);
   RECT rect;
 
-  CreateListBoxStruct(hwnd, ODT_LISTBOX, GetWindowLong(hwnd,GWL_STYLE), GetParent(hwnd));
+  CreateListBoxStruct(hwnd, ODT_LISTBOX, dwStyle, GetParent(hwnd));
   lphl = ListBoxGetStorageHeader(hwnd);
-  dprintf_listbox(stddeb,"ListBox WM_CREATE %p !\n", lphl);
+  dprintf_listbox(stddeb,"ListBox created: lphl = %p dwStyle = "NPFMT":"NPFMT"\n", 
+			  lphl, HIWORD(dwStyle), LOWORD(dwStyle));
 
   GetClientRect(hwnd,&rect);
   lphl->ColumnsWidth = rect.right - rect.left;
@@ -731,7 +776,7 @@
   ListBoxResetContent(lphl);
 
   DestroyListBoxStruct(lphl);
-  dprintf_listbox(stddeb,"ListBox WM_DESTROY %p !\n", lphl);
+  dprintf_listbox(stddeb,"ListBox destroyed: lphl = %p\n",lphl);
   return 0;
 }
 
@@ -850,6 +895,7 @@
   WORD       wRet;
   int        y;
   RECT       rectsel;
+  LONG	     dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
 
   SetFocus(hwnd);
   SetCapture(hwnd);
@@ -860,19 +906,32 @@
   if (y == -1)
     return 0;
 
-  if (lphl->dwStyle & LBS_MULTIPLESEL) {
+  if (dwStyle & LBS_MULTIPLESEL) {
     lphl->ItemFocused = y;
     wRet = ListBoxGetSel(lphl, y);
     ListBoxSetSel(lphl, y, !wRet);
+
+    InvalidateRect(hwnd, NULL, TRUE);
   } else {
     ListBoxSetCurSel(lphl, y);
-  }
-  if (lphl->dwStyle & LBS_MULTIPLESEL)
-    ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
 
   ListBoxGetItemRect(lphl, y, &rectsel);
+    InvalidateRect(hwnd, &rectsel, TRUE);
+    if(lphl->PrevFocused) {
+        ListBoxGetItemRect(lphl, lphl->PrevFocused, &rectsel);
+	InvalidateRect(hwnd, &rectsel, TRUE);
+    } 
+  }
 
-  InvalidateRect(hwnd, NULL, TRUE);
+  if (dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL))
+    ListBoxSendNotification(lphl, LBN_SELCHANGE);
+
+  if (dwStyle & LBS_NOTIFY)
+    SendMessage(lphl->hParent, WM_LBTRACKPOINT, y, lParam);
+
+  if (GetWindowLong(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT)
+     if( DragDetect(lphl->hSelf,MAKEPOINT(lParam)) )
+         SendMessage(lphl->hParent, WM_BEGINDRAG,0,0L);
 
   return 0;
 }
@@ -887,7 +946,7 @@
   if (GetCapture() == hwnd) ReleaseCapture();
 
   if (lphl->PrevFocused != lphl->ItemFocused)
-    ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
+    ListBoxSendNotification(lphl, LBN_SELCHANGE);
 
   return 0;
 }
@@ -919,6 +978,7 @@
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   int  y;
   WORD wRet;
+  LONG  dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
   RECT rect, rectsel;   /* XXX Broken */
 
   dprintf_listbox(stddeb,"LBMouseMove %d %d\n",SLOWORD(lParam),SHIWORD(lParam));
@@ -947,14 +1007,16 @@
 	if (wRet == lphl->ItemFocused)  {
 	  return 0;
 	}
-	if (lphl->dwStyle & LBS_MULTIPLESEL) {
+	if (dwStyle & LBS_MULTIPLESEL) {
 	  lphl->ItemFocused = wRet;
-	  ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
+	  ListBoxSendNotification(lphl, LBN_SELCHANGE);
 	} else {
 	  ListBoxSetCurSel(lphl, wRet);
+	  if(dwStyle & LBS_EXTENDEDSEL)
+	     ListBoxSendNotification(lphl, LBN_SELCHANGE);
 	}
 	ListBoxGetItemRect(lphl, wRet, &rectsel);
-	InvalidateRect(hwnd, NULL, TRUE);
+	InvalidateRect(hwnd, &rectsel, TRUE);
       }
     }
   }
@@ -964,20 +1026,42 @@
 
 /***********************************************************************
  *           LBKeyDown
+ *
+ * Doesn't yet handle properly VK_SHIFT with LB_EXTENDEDSEL
  */
 static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
-  WORD       newFocused = lphl->ItemFocused;
+  LONG       dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
+  WORD       newFocused = 0xFFFF;
+  RECT	     rect;
 
-  if (wParam == VK_SPACE) {
-    if (lphl->dwStyle & LBS_MULTIPLESEL) {
-      WORD wRet = ListBoxGetSel(lphl, lphl->ItemFocused);
-      ListBoxSetSel(lphl, lphl->ItemFocused, !wRet);
-    }
-    return 0;
+  ListBoxGetItemRect(lphl,lphl->ItemFocused,&rect);
+  switch(wParam) 
+    {
+	/* ugly kludge that belongs in TranslateMessage */
+
+	case VK_HOME:
+	case VK_END:
+	case VK_LEFT:
+	case VK_RIGHT:
+	case VK_UP:
+	case VK_DOWN:
+	case VK_PRIOR:
+	case VK_NEXT:
+	     if ( dwStyle & LBS_WANTKEYBOARDINPUT )
+	        {
+		  newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_VKEYTOITEM,
+					              wParam,MAKELPARAM(lphl->ItemFocused,hwnd));
+	          if ( newFocused == 0xFFFE ) return 0L;
   }
-  switch(wParam) {
+	     if ( newFocused == 0xFFFF ) 
+		{
+		  newFocused = lphl->ItemFocused;
+
+		  /* nested switch */
+		  switch(wParam)
+		    {
   case VK_HOME:
     newFocused = 0;
     break;
@@ -985,7 +1069,7 @@
     newFocused = lphl->ItemsCount - 1;
     break;
   case VK_LEFT:
-    if (lphl->dwStyle & LBS_MULTICOLUMN) {
+  			  if (dwStyle & LBS_MULTICOLUMN) {
       if (newFocused >= lphl->ItemsPerColumn) {
 	newFocused -= lphl->ItemsPerColumn;
       } else {
@@ -997,19 +1081,16 @@
     if (newFocused > 0) newFocused--;
     break;
   case VK_RIGHT:
-    if (lphl->dwStyle & LBS_MULTICOLUMN) {
+			    if (dwStyle & LBS_MULTICOLUMN) 
       newFocused += lphl->ItemsPerColumn;
-    }
     break;
   case VK_DOWN:
     newFocused++;
     break;
   case VK_PRIOR:
-    if (newFocused > lphl->ItemsVisible) {
+			    if (newFocused > lphl->ItemsVisible)
       newFocused -= lphl->ItemsVisible;
-    } else {
-      newFocused = 0;
-    }
+			    else  newFocused = 0;
     break;
   case VK_NEXT:
     newFocused += lphl->ItemsVisible;
@@ -1017,19 +1098,49 @@
   default:
     return 0;
   }
+		  /* end of nested switch */
+		}
+	     break;   
+	case VK_SPACE:
+             if (dwStyle & LBS_MULTIPLESEL)
+                {
+                 WORD wRet = ListBoxGetSel(lphl, lphl->ItemFocused);
+                 ListBoxSetSel(lphl, lphl->ItemFocused, !wRet);
+                 }
+             return 0;
+
+        /* chars are handled in LBChar */
+	default:
+	     return 0;
+    }
+
+  /* at this point newFocused is set up */
 
   if (newFocused >= lphl->ItemsCount)
     newFocused = lphl->ItemsCount - 1;
   
-  if (!(lphl->dwStyle & LBS_MULTIPLESEL)) {
+  if (!(dwStyle & LBS_MULTIPLESEL)) 
+     {
     ListBoxSetCurSel(lphl, newFocused);
-    ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
+	ListBoxSendNotification(lphl, LBN_SELCHANGE);
   }
 
   lphl->ItemFocused = newFocused;
-  ListBoxScrollToFocus(lphl); 
-  SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
+
+  if( ListBoxScrollToFocus(lphl) || (dwStyle & 
+                          (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) )
   InvalidateRect(hwnd, NULL, TRUE);
+  else
+    {
+	InvalidateRect(hwnd, &rect, TRUE);
+	if( newFocused < 0x8000 )
+          {
+	   ListBoxGetItemRect(lphl, newFocused, &rect);
+	   InvalidateRect(hwnd, &rect, TRUE);
+          }
+    }
+
+  SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
 
   return 0;
 }
@@ -1040,21 +1151,34 @@
 static LONG LBChar(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
-  WORD       newFocused;
+  LONG	     dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
+  WORD       newFocused = 0xFFFF;
 
+  if ( (dwStyle & LBS_WANTKEYBOARDINPUT) && !(lphl->HasStrings))
+       {
+        newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_CHARTOITEM,
+                                            wParam,MAKELPARAM(lphl->ItemFocused,hwnd));
+        if ( newFocused == 0xFFFE ) return 0L;
+       }
+
+  if (newFocused == 0xFFFF ) 
   newFocused = ListBoxFindNextMatch(lphl, wParam);
+
   if (newFocused == (WORD)LB_ERR) return 0;
 
   if (newFocused >= lphl->ItemsCount)
     newFocused = lphl->ItemsCount - 1;
-  if (!(lphl->dwStyle & LBS_MULTIPLESEL)) {
+
+  if (!(dwStyle & LBS_MULTIPLESEL)) 
+     {
     ListBoxSetCurSel(lphl, newFocused);
-    ListBoxSendNotification(lphl, hwnd, LBN_SELCHANGE);
+	ListBoxSendNotification(lphl, LBN_SELCHANGE);
   }
 
   lphl->ItemFocused = newFocused;
   ListBoxScrollToFocus(lphl);
   SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
+
   InvalidateRect(hwnd, NULL, TRUE);
 
   return 0;
@@ -1095,6 +1219,7 @@
 static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl = ListBoxGetStorageHeader(hwnd);
+  LONG	       dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
   LPLISTSTRUCT lpls;
   PAINTSTRUCT  ps;
   HBRUSH       hBrush;
@@ -1127,7 +1252,7 @@
   FillRect(hdc, &rect, hBrush);
 
   maxwidth = rect.right;
-  if (lphl->dwStyle & LBS_MULTICOLUMN) {
+  if (dwStyle & LBS_MULTICOLUMN) {
     rect.right = lphl->ColumnsWidth;
   }
   lpls = lphl->lpFirst;
@@ -1142,7 +1267,7 @@
       height = lpls->mis.itemHeight;
 
       if (top > rect.bottom) {
-	if (lphl->dwStyle & LBS_MULTICOLUMN) {
+	if (dwStyle & LBS_MULTICOLUMN) {
 	  lphl->ItemsPerColumn = MAX(lphl->ItemsPerColumn, ipc);
 	  ipc = 0;
 	  top = 0;
@@ -1159,7 +1284,7 @@
       lpls->itemRect.left   = rect.left;
       lpls->itemRect.right  = rect.right;
 
-      dprintf_listbox(stddeb,"drawing item: %d %d %d %d %d\n",rect.left,top,rect.right,top+height,lpls->itemState);
+      dprintf_listbox(stddeb,"drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top,(LONG)rect.right,top+height,lpls->itemState);
       if (lphl->OwnerDrawn) {
 	ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0);
 	if (lpls->itemState)
@@ -1370,7 +1495,7 @@
 static LONG LBGetSel(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
-  return ListBoxGetSel(lphl, wParam);
+  return (ListBoxGetSel(lphl, wParam) )? 1 : 0;
 }
 
 /***********************************************************************
@@ -1381,15 +1506,19 @@
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls;
   int          cnt = 0;
+  int          items = 0;
 
-  if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return LB_ERR;
+  if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & 
+       (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)  )) 
+	 return LB_ERR;
 
-  lpls = lphl->lpFirst;
-
-  while (lpls != NULL) {
-    if (lpls->itemState > 0) cnt++;
-
-    lpls = lpls->lpNext;
+  for( lpls = lphl->lpFirst;
+       lpls;
+       lpls = lpls->lpNext )
+	{
+	   items++;
+           if (lpls->itemState ) 
+               cnt++;
   }
 
   return cnt;
@@ -1405,7 +1534,9 @@
   int cnt, idx;
   int *lpItems = PTR_SEG_TO_LIN(lParam);
 
-  if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return LB_ERR;
+  if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & 
+       (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)  )) 
+        return LB_ERR;
 
   if (wParam == 0) return 0;
 
@@ -1481,7 +1612,9 @@
   WORD         last = HIWORD(lParam);
   BOOL         select = wParam;
 
-  if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return LB_ERR;
+  if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & 
+       (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)  )) 
+        return LB_ERR;
 
   if (first >= lphl->ItemsCount ||
       last >= lphl->ItemsCount) return LB_ERR;
@@ -1509,7 +1642,7 @@
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
-  if (!(lphl->dwStyle & LBS_MULTIPLESEL)) return 0;
+  if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_MULTIPLESEL)) return 0;
   if (wParam >= lphl->ItemsCount) return LB_ERR;
 
   lphl->ItemFocused = wParam;
@@ -1650,6 +1783,20 @@
 }
 
 /***********************************************************************
+ *	     LBPassToParent
+ */
+static LRESULT LBPassToParent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+  WND* ptrWnd = WIN_FindWndPtr(hwnd);  
+
+  if( ptrWnd )
+	if( /* !(ptrWnd->dwExStyle & WS_EX_NOPARENTNOTIFY) && */ 
+                 ptrWnd->hwndParent ) 
+		 return SendMessage(ptrWnd->hwndParent,message,wParam,lParam);
+  return 0;
+}
+
+/***********************************************************************
  *           ListBoxWndProc 
  */
 LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -1702,6 +1849,24 @@
      case LB_SETSEL: return LBSetSel(hwnd, wParam, lParam);
      case LB_SETTOPINDEX: return LBSetTopIndex(hwnd, wParam, lParam);
      case LB_SETITEMHEIGHT: return LBSetItemHeight(hwnd, wParam, lParam);
+
+     case WM_DROPFILES: return LBPassToParent(hwnd, message, wParam, lParam);
+
+	case WM_DROPOBJECT:
+	case WM_QUERYDROPOBJECT:
+	case WM_DRAGSELECT:
+	case WM_DRAGMOVE:
+	        {
+		 LPDRAGINFO lpDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN((SEGPTR)lParam);
+		 LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
+
+	         /* more undocumented Microsoft crap - drag&drop depends on it - AK */
+
+		 lpDragInfo->l = ListBoxFindMouse(lphl,lpDragInfo->pt.x,
+						       lpDragInfo->pt.y);
+	        
+		 return LBPassToParent(hwnd, message, wParam, lParam);
+		}
     }
     
     return DefWindowProc(hwnd, message, wParam, lParam);
diff --git a/controls/menu.c b/controls/menu.c
index b14d1ab..41f5a8b 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -302,7 +302,7 @@
     lpitem->rect.bottom += MAX( HIWORD(dwSize), SYSMETRICS_CYMENU );
 
     if (menuBar) lpitem->rect.right += MENU_BAR_ITEMS_SPACE;
-    else if ((p = strchr( lpitem->item_text, '\t' )) != NULL)
+    else if ( ( lpitem->item_text != NULL ) && (p = strchr( lpitem->item_text, '\t' )) != NULL)
     {
 	  /* Item contains a tab (only meaningful in popup menus) */
 	lpitem->xTab = check_bitmap_width + MENU_TAB_SPACE + 
@@ -312,7 +312,7 @@
     }
     else
     {
-	if (strchr( lpitem->item_text, '\b' ))
+	if( ( lpitem->item_text != NULL ) && strchr( lpitem->item_text, '\b' ))
 	    lpitem->rect.right += MENU_TAB_SPACE;
 	lpitem->xTab = lpitem->rect.right - check_bitmap_width 
 	                - arrow_bitmap_width;
diff --git a/debugger/dbg.y b/debugger/dbg.y
index cd3b9cf..fbca65e 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -35,7 +35,7 @@
 
 %token CONT STEP LIST NEXT QUIT HELP BACKTRACE INFO STACK SEGMENTS REGS
 %token ENABLE DISABLE BREAK DELETE SET MODE PRINT EXAM DEFINE ABORT
-%token NO_SYMBOL
+%token NO_SYMBOL EOL
 %token SYMBOLFILE
 
 %token <string> IDENTIFIER
@@ -68,55 +68,55 @@
  input:   line			{ issue_prompt(); }
 	| input line		{ issue_prompt(); }
 
- line:  command '\n'
-	| '\n'
-	| error	'\n'	       { yyerrok; }
+ line:  command 
+	| EOL
+	| error	EOL	       { yyerrok; }
 
- command: QUIT	               { exit(0); }
-	| HELP	               { DEBUG_Help(); }
-	| CONT	               { dbg_exec_mode = EXEC_CONT; return 0; }
-	| STEP	               { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
-	| NEXT	               { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
-	| LIST		       { DEBUG_List( NULL, 15 ); }
-	| LIST addr	       { DEBUG_List( &$2, 15 ); }
-	| ABORT	               { kill(getpid(), SIGABRT); }
-	| SYMBOLFILE IDENTIFIER { DEBUG_ReadSymbolTable( $2 ); }
-	| DEFINE IDENTIFIER addr { DEBUG_AddSymbol( $2, &$3 ); }
-	| MODE NUM	       { mode_command($2); }
-	| ENABLE NUM	       { DEBUG_EnableBreakpoint( $2, TRUE ); }
-	| DISABLE NUM	       { DEBUG_EnableBreakpoint( $2, FALSE ); }
-	| BREAK '*' addr       { DEBUG_AddBreakpoint( &$3 ); }
-	| BREAK symbol	       { DEBUG_AddBreakpoint( &$2 ); }
-	| BREAK		       { DBG_ADDR addr = { CS_reg(DEBUG_context),
+ command: QUIT EOL             { exit(0); }
+	| HELP EOL             { DEBUG_Help(); }
+	| CONT EOL             { dbg_exec_mode = EXEC_CONT; return 0; }
+	| STEP EOL             { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
+	| NEXT EOL             { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
+	| LIST EOL	       { DEBUG_List( NULL, 15 ); }
+	| LIST addr EOL	       { DEBUG_List( &$2, 15 ); }
+	| ABORT	EOL            { kill(getpid(), SIGABRT); }
+	| SYMBOLFILE IDENTIFIER EOL  { DEBUG_ReadSymbolTable( $2 ); }
+	| DEFINE IDENTIFIER addr EOL { DEBUG_AddSymbol( $2, &$3 ); }
+	| MODE NUM EOL	       { mode_command($2); }
+	| ENABLE NUM EOL       { DEBUG_EnableBreakpoint( $2, TRUE ); }
+	| DISABLE NUM EOL      { DEBUG_EnableBreakpoint( $2, FALSE ); }
+	| BREAK '*' addr EOL   { DEBUG_AddBreakpoint( &$3 ); }
+	| BREAK symbol EOL     { DEBUG_AddBreakpoint( &$2 ); }
+	| BREAK EOL	       { DBG_ADDR addr = { CS_reg(DEBUG_context),
 						     EIP_reg(DEBUG_context) };
 				 DEBUG_AddBreakpoint( &addr );
 			       }
-	| DELETE BREAK NUM     { DEBUG_DelBreakpoint( $3 ); }
-	| BACKTRACE	       { DEBUG_BackTrace(); }
+	| DELETE BREAK NUM EOL { DEBUG_DelBreakpoint( $3 ); }
+	| BACKTRACE EOL	       { DEBUG_BackTrace(); }
 	| infocmd
 	| x_command
 	| print_command
 	| deposit_command
 
 deposit_command:
-	SET REG '=' expr	   { DEBUG_SetRegister( $2, $4 ); }
-	| SET '*' addr '=' expr	   { DEBUG_WriteMemory( &$3, $5 ); }
-	| SET IDENTIFIER '=' addr  { if (!DEBUG_SetSymbolValue( $2, &$4 ))
-				       {
-					 fprintf( stderr,
+	SET REG '=' expr EOL	      { DEBUG_SetRegister( $2, $4 ); }
+	| SET '*' addr '=' expr	EOL   { DEBUG_WriteMemory( &$3, $5 ); }
+	| SET IDENTIFIER '=' addr EOL { if (!DEBUG_SetSymbolValue( $2, &$4 ))
+				         {
+					   fprintf( stderr,
 						 "Symbol %s not found\n", $2 );
-					 YYERROR;
+					   YYERROR;
+				         }
 				       }
-				   }
 
 
 x_command:
-	  EXAM addr  { DEBUG_ExamineMemory( &$2, 1, 'x'); }
-	| EXAM FORMAT addr  { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); }
+	  EXAM addr EOL         { DEBUG_ExamineMemory( &$2, 1, 'x'); }
+	| EXAM FORMAT addr EOL  { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); }
 
  print_command:
-	  PRINT addr	     { DEBUG_Print( &$2, 1, 'x' ); }
-	| PRINT FORMAT addr  { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); }
+	  PRINT addr EOL        { DEBUG_Print( &$2, 1, 'x' ); }
+	| PRINT FORMAT addr EOL { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); }
 
  symbol: IDENTIFIER   { if (!DEBUG_GetSymbolValue( $1, &$$ ))
 			{
@@ -175,11 +175,11 @@
 					  $$ = DEBUG_ReadMemory( &addr ); }
 	| '*' segaddr %prec OP_DEREF	{ $$ = DEBUG_ReadMemory( &$2 ); }
 	
- infocmd: INFO REGS	      { DEBUG_InfoRegisters(); }
-	| INFO STACK	      { DEBUG_InfoStack(); }
-	| INFO BREAK	      { DEBUG_InfoBreakpoints(); }
-	| INFO SEGMENTS	      { LDT_Print( 0, -1 ); }
-	| INFO SEGMENTS expr  { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
+ infocmd: INFO REGS EOL	          { DEBUG_InfoRegisters(); }
+	| INFO STACK EOL          { DEBUG_InfoStack(); }
+	| INFO BREAK EOL          { DEBUG_InfoBreakpoints(); }
+	| INFO SEGMENTS EOL	  { LDT_Print( 0, -1 ); }
+	| INFO SEGMENTS expr EOL  { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
 
 
 %%
diff --git a/debugger/debug.l b/debugger/debug.l
index c46eb10..e6de8fc 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -34,7 +34,7 @@
 
 %%
 
-\n		{ syntax_error = 0; return '\n'; } /*Indicates end of command*/
+\n		{ syntax_error = 0; return EOL; } /*Indicates end of command*/
 
 "||"		{ return OP_LOR; }
 "&&"		{ return OP_LAND; }
@@ -82,7 +82,7 @@
 
 info|inf|in			{ return INFO; }
 show|sho|sh			{ return INFO; }
-list|l				{ return LIST; }
+list|lis|li|l			{ return LIST; }
 segments|segment|segm|seg|se	{ return SEGMENTS; }
 break|brea|bre|br|b		{ return BREAK; }
 enable|enabl|enab|ena		{ return ENABLE;}
diff --git a/if1632/advapi32.spec b/if1632/advapi32.spec
index 8e33899..2676a5c 100644
--- a/if1632/advapi32.spec
+++ b/if1632/advapi32.spec
@@ -68,7 +68,7 @@
 0064 stub GetSidSubAuthority
 0065 stub GetSidSubAuthorityCount
 0066 stub GetTokenInformation
-0067 stub GetUserNameA
+0067 stdcall  GetUserNameA(ptr ptr) GetUserNameA
 0068 stub GetUserNameW
 0069 stub ImpersonateLoggedOnUser
 0070 stub ImpersonateNamedPipeClient
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 5dd5593..4249cbd 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -246,8 +246,8 @@
 364 pascal16 SetPaletteEntries(word word word ptr) SetPaletteEntries
 365 pascal16 RealizeDefaultPalette(word) RealizeDefaultPalette
 366 stub UpdateColors
-367 stub AnimatePalette
-368 stub ResizePalette
+367 pascal16 AnimatePalette(word word word ptr) AnimatePalette
+368 pascal16 ResizePalette(word word) ResizePalette
 370 pascal16 GetNearestPaletteIndex(word long) GetNearestPaletteIndex
 372 pascal16 ExtFloodFill(word s_word s_word long word) ExtFloodFill
 373 pascal16 SetSystemPaletteUse(word word) SetSystemPaletteUse
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 9a5b15f..7f9b7c6 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -114,8 +114,8 @@
 115 pascal OutputDebugString(ptr) OutputDebugString
 116 stub InitLib
 117 pascal16 OldYield() OldYield
-118 stub GetTaskQueueDS
-119 stub GetTaskQueueES
+118 register GetTaskQueueDS() GetTaskQueueDS
+119 register GetTaskQueueES() GetTaskQueueES
 120 stub UndefDynLink
 121 pascal16 LocalShrink(word word) LocalShrink
 122 pascal16 IsTaskLocked() IsTaskLocked
@@ -164,7 +164,7 @@
 164 pascal16 GlobalLRUNewest(word) GlobalLRUNewest
 165 stub A20Proc
 166 pascal16 WinExec(ptr word) WinExec
-167 stub GetExpWinVer
+167 pascal16 GetExpWinVer(word) GetExpWinVer
 168 pascal16 DirectResAlloc(word word word) DirectResAlloc
 169 pascal GetFreeSpace(word) GetFreeSpace
 170 pascal16 AllocCStoDSAlias(word) AllocCStoDSAlias
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 1987061..e9e9abf 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -24,7 +24,7 @@
 0020 stub ClearCommBreak
 0021 stub ClearCommError
 0022 stub CloseConsoleHandle
-0023 stub CloseHandle
+0023    stdcall CloseHandle(long) CloseHandle
 0024 stub CloseProfileUserMapping
 0025 stub CmdBatNotification
 0026 stub CommConfigDialogA
@@ -46,7 +46,7 @@
 0042 stub CreateDirectoryW
 0043 stub CreateEventA
 0044 stub CreateEventW
-0045 stub CreateFileA
+0045   stdcall CreateFileA(ptr long long ptr long long long) CreateFileA
 0046 stub CreateFileMappingA
 0047 stub CreateFileMappingW
 0048 stub CreateFileW
@@ -101,7 +101,7 @@
 0097 stub EnumTimeFormatsW
 0098 stub EraseTape
 0099 stub EscapeCommFunction
-0100 stub ExitProcess
+0100   stdcall ExitProcess(long) ExitProcess
 0101 stub ExitThread
 0102 stub ExitVDM
 0103 stub ExpandEnvironmentStringsA
@@ -200,7 +200,7 @@
 0196 stub GetCurrentDirectoryA
 0197 stub GetCurrentDirectoryW
 0198 stub GetCurrentProcess
-0199 stub GetCurrentProcessId
+0199 stdcall GetCurrentProcessId() GetCurrentThreadId
 0200 stub GetCurrentThread
 0201	stdcall GetCurrentThreadId()	GetCurrentThreadId
 0202 stub GetDateFormatA
@@ -220,7 +220,7 @@
 0216 stub GetExitCodeThread
 0217 stub GetFileAttributesA
 0218 stub GetFileAttributesW
-0219 stub GetFileInformationByHandle
+0219   stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
 0220 stub GetFileSize
 0221 stub GetFileTime
 0222    stdcall GetFileType(long) GetFileType
@@ -238,7 +238,7 @@
 0234 stub GetMailslotInfo
 0235	stdcall GetModuleFileNameA(long ptr long) GetModuleFileNameA
 0236 stub GetModuleFileNameW
-0237	stdcall GetModuleHandleA(ptr)	GetModuleHandle
+0237	stdcall GetModuleHandleA(ptr)	WIN32_GetModuleHandle
 0238 stub GetModuleHandleW
 0239 stub GetNamedPipeHandleStateA
 0240 stub GetNamedPipeHandleStateW
@@ -265,7 +265,7 @@
 0261 stub GetProcessShutdownParameters
 0262 stub GetProcessTimes
 0263 stub GetProcessWorkingSetSize
-0264 stub GetProfileIntA
+0264 	stdcall GetProfileIntA(ptr ptr long) GetProfileInt
 0265 stub GetProfileIntW
 0266 stub GetProfileSectionA
 0267 stub GetProfileSectionW
@@ -394,7 +394,7 @@
 0389 stub MoveFileExW
 0390 stub MoveFileW
 0391 stub MulDiv
-0392 stub MultiByteToWideChar
+0392 stdcall MultiByteToWideChar(long long ptr long ptr long) MultiByteToWideChar
 0393 stub OpenConsoleW
 0394 stub OpenEventA
 0395 stub OpenEventW
@@ -430,7 +430,7 @@
 0425 stub ReadConsoleOutputCharacterW
 0426 stub ReadConsoleOutputW
 0427 stub ReadConsoleW
-0428 stub ReadFile
+0428 stdcall ReadFile(long ptr long ptr ptr) ReadFile
 0429 stub ReadFileEx
 0430 stub ReadProcessMemory
 0431 stub RegisterConsoleVDM
@@ -461,7 +461,7 @@
 0456 stub SetConsoleActiveScreenBuffer
 0457 stub SetConsoleCP
 0458 stub SetConsoleCommandHistoryMode
-0459 stub SetConsoleCtrlHandler
+0459 stdcall SetConsoleCtrlHandler(ptr long) SetConsoleCtrlHandler
 0460 stub SetConsoleCursor
 0461 stub SetConsoleCursorInfo
 0462 stub SetConsoleCursorPosition
@@ -610,11 +610,11 @@
 0605 stub lstrcmpiA
 0606 stub lstrcmpiW
 0607 stub lstrcpy
-0608 stub lstrcpyA
+0608 	stdcall lstrcpyA(ptr ptr) strcpy
 0609 stub lstrcpyW
 0610 stub lstrcpyn
 0611 stub lstrcpynA
 0612 stub lstrcpynW
 0613 stub lstrlen
-0614 stub lstrlenA
+0614 	stdcall lstrlenA(ptr) strlen
 0615 stub lstrlenW
diff --git a/if1632/user.spec b/if1632/user.spec
index 469bbc5..fae1cc0 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -405,13 +405,13 @@
 456 pascal16 LoadIconHandler(word word) LoadIconHandler
 457 pascal16 DestroyIcon(word) DestroyIcon
 458 pascal16 DestroyCursor(word) DestroyCursor
-459 pascal   DumpIcon(ptr ptr ptr ptr) DumpIcon
+459 pascal   DumpIcon(segptr ptr ptr ptr) DumpIcon
 460 pascal16 GetInternalWindowPos(word ptr ptr) GetInternalWindowPos
 461 pascal16 SetInternalWindowPos(word word ptr ptr) SetInternalWindowPos
 462 pascal16 CalcChildScroll(word word) CalcChildScroll
 463 stub ScrollChildren
-464 pascal16 DragObject(word word word word word word) DragObject
-465 stub DragDetect
+464 pascal   DragObject(word word word word word word) DragObject
+465 pascal16 DragDetect(word long) DragDetect
 466 pascal16 DrawFocusRect(word ptr) DrawFocusRect
 470 stub StringFunc
 471 pascal16 lstrcmpi(ptr ptr) lstrcmpi
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 3c7927b..c525e30 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -199,7 +199,7 @@
 0194 stub ExcludeUpdateRgn
 0195 stub ExitWindowsEx
 0196 stub FillRect
-0197 stub FindWindowA
+0197 	return FindWindowA 8 0
 0198 stub FindWindowExA
 0199 stub FindWindowExW
 0200 stub FindWindowW
@@ -290,7 +290,7 @@
 0285 stub GetScrollRange
 0286 stub GetShellWindow
 0287 stub GetSubMenu
-0288 stub GetSysColor
+0288 	stdcall GetSysColor(long) GetSysColor
 0289 stub GetSysColorBrush
 0290 stub GetSystemMenu
 0291 stub GetSystemMetrics
@@ -356,15 +356,15 @@
 0351 stub IsZoomed
 0352 stub KillSystemTimer
 0353 stub KillTimer
-0354 stub LoadAcceleratorsA
+0354 	stdcall LoadAcceleratorsA(long ptr) LoadAccelerators
 0355 stub LoadAcceleratorsW
-0356 stub LoadBitmapA
+0356 	stdcall LoadBitmapA(long ptr) LoadBitmap
 0357 stub LoadBitmapW
-0358 stub LoadCursorA
+0358 	stdcall LoadCursorA(long ptr) LoadCursor
 0359 stub LoadCursorFromFileA
 0360 stub LoadCursorFromFileW
 0361 stub LoadCursorW
-0362 stub LoadIconA
+0362 	stdcall LoadIconA(long ptr) LoadIcon
 0363 stub LoadIconW
 0364 stub LoadImageA
 0365 stub LoadImageW
@@ -376,7 +376,7 @@
 0371 stub LoadMenuIndirectW
 0372 stub LoadMenuW
 0373 stub LoadRemoteFonts
-0374 stub LoadStringA
+0374 	stdcall LoadStringA(long long ptr long) LoadString
 0375 stub LoadStringW
 0376 stub LockWindowStation
 0377 stub LockWindowUpdate
@@ -473,7 +473,7 @@
 0468 stub SetClassWord
 0469 stub SetClipboardData
 0470 stub SetClipboardViewer
-0471 stub SetCursor
+0471 	stdcall SetCursor(long) SetCursor
 0472 stub SetCursorContents
 0473 stub SetCursorPos
 0474 stub SetDebugErrorLevel
@@ -495,7 +495,7 @@
 0490 stub SetMenuItemInfoA
 0491 stub SetMenuItemInfoW
 0492 stub SetMessageExtraInfo
-0493 stub SetMessageQueue
+0493 stdcall  SetMessageQueue(long) SetMessageQueue
 0494 stub SetParent
 0495 stub SetProcessWindowStation
 0496 stub SetPropA
@@ -541,7 +541,7 @@
 0536 stub SwapMouseButton
 0537 stub SwitchDesktop
 0538 stub SwitchToThisWindow
-0539 stub SystemParametersInfoA
+0539 	stdcall SystemParametersInfoA(long long ptr long) SystemParametersInfo
 0540 stub SystemParametersInfoW
 0541 stub TabbedTextOutA
 0542 stub TabbedTextOutW
@@ -586,7 +586,7 @@
 0581 stub WindowFromPoint
 0582 stub keybd_event
 0583 stub mouse_event
-0584 stub wsprintfA
+0584 	cdecl wsprintfA(ptr ptr ...) wsprintf
 0585 stub wsprintfW
 0586 stub wvsprintfA
 0587 stub wvsprintfW
diff --git a/include/bitmaps/ocr_bummer b/include/bitmaps/ocr_bummer
new file mode 100644
index 0000000..fa31df1
--- /dev/null
+++ b/include/bitmaps/ocr_bummer
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_bummer[] = {
+"32 32 3 1 5 9",
+" 	s black c black",
+"X	s white	c white",
+".	s None	c None",
+"............       .............",
+"........... XXXXXXX ............",
+".........  XXXXXXXXX ...........",
+"........ XXXXXXXXXXXXX .........",
+"....... XX  XXXXXXX  XX ........",
+"....... X .. XXXXX .. X ........",
+"....... X ... XXX ... X ........",
+"....... X ... XXX ... X ........",
+"...... XX ... XXX ... XX .......",
+"...... XXX   XXXXX   XXX .......",
+"...... XXXXXXXX XXXXXXXX .......",
+"...... XXXXXXX . XXXXXXX .......",
+".  .... XXXXXX . XXXXXX ...  ...",
+" XX ....  XXXX . XXXX  ... XX ..",
+". XX  ....  XX   XX  ....  X ...",
+" XXXXX   .. XXXXXXX ..   XXXX ..",
+" XX   XXX   XXXXXXX   XXX  XX ..",
+".  ...   XXX   X   XXX   ..  ...",
+".........   XXX       ..........",
+"..........     XXXX   ..........",
+"......   XXXX      XXX   .......",
+".     XXX    ......   XXX    ...",
+" XXXXX   .............   XXXX ..",
+" XX   ...................  XX ..",
+". X ...................... X ...",
+". X ...................... X ...",
+".. ........................ ....",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/include/bitmaps/ocr_dragobject b/include/bitmaps/ocr_dragobject
new file mode 100644
index 0000000..def5290
--- /dev/null
+++ b/include/bitmaps/ocr_dragobject
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_dragobject[] = {
+"32 32 3 1 5 9",
+" 	s black	c black",
+".	s None	c None",
+"X	s white	c white",
+"         .......................",
+" XXXXXXX   .....................",
+" XXXXXXX X  ....................",
+" XXXXXXX    ....................",
+" XXXXXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXXXXXXXX ....................",
+" XXXX XXXXX ....................",
+" XXXX  XXXX ....................",
+" XXXX X XXX ....................",
+" XXXX XX XX ....................",
+" XXXX XXX X ....................",
+"      XXXX .....................",
+"..... XXXXX ....................",
+"..... XXXXXX ...................",
+"..... XXXXXXX ..................",
+"..... XXXXXXXX .................",
+"..... XXXXX     ................",
+"..... XX  X ....................",
+"..... X . XX ...................",
+".....  ... X ...................",
+"..... .... XX ..................",
+"........... X ..................",
+"........... XX .................",
+"............ X .................",
+"............. ..................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/include/debug.h b/include/debug.h
index a67f722..928922e 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -37,6 +37,7 @@
 #undef DEBUG_DRIVER
 #undef DEBUG_EDIT
 #undef DEBUG_ENUM
+#undef DEBUG_ENV
 #undef DEBUG_EVENT
 #undef DEBUG_EXEC
 #undef DEBUG_FILE
@@ -45,6 +46,7 @@
 #undef DEBUG_GDI
 #undef DEBUG_GLOBAL
 #undef DEBUG_GRAPHICS
+#undef DEBUG_HOOK
 #undef DEBUG_ICON
 #undef DEBUG_INT
 #undef DEBUG_KEY
@@ -89,6 +91,7 @@
 #undef DEBUG_UTILITY
 #undef DEBUG_VXD
 #undef DEBUG_WIN
+#undef DEBUG_WIN32
 #undef DEBUG_WINSOCK
 #endif
 
@@ -114,6 +117,7 @@
 #define DEBUG_DRIVER
 #define DEBUG_EDIT
 #define DEBUG_ENUM
+#define DEBUG_ENV
 #define DEBUG_EVENT
 #define DEBUG_EXEC
 #define DEBUG_FILE
@@ -122,6 +126,7 @@
 #define DEBUG_GDI
 #define DEBUG_GLOBAL
 #define DEBUG_GRAPHICS
+#define DEBUG_HOOK
 #define DEBUG_ICON
 #define DEBUG_INT
 #define DEBUG_KEY
@@ -166,6 +171,7 @@
 #define DEBUG_UTILITY
 #define DEBUG_VXD
 #define DEBUG_WIN
+#define DEBUG_WIN32
 #define DEBUG_WINSOCK
 #endif
 
@@ -277,6 +283,11 @@
 #else
     0,
 #endif
+#ifdef DEBUG_ENV
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_EVENT
     1,
 #else
@@ -317,6 +328,11 @@
 #else
     0,
 #endif
+#ifdef DEBUG_HOOK
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_ICON
     1,
 #else
@@ -537,6 +553,11 @@
 #else
     0,
 #endif
+#ifdef DEBUG_WIN32
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_WINSOCK
     1,
 #else
@@ -823,8 +844,21 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_event if(!debug_msg_enabled[21]) ; else fprintf
-#define debugging_event debug_msg_enabled[21]
+#define dprintf_env if(!debug_msg_enabled[21]) ; else fprintf
+#define debugging_env debug_msg_enabled[21]
+#else
+#ifdef DEBUG_ENV
+#define dprintf_env fprintf
+#define debugging_env 1
+#else
+#define dprintf_env while(0) fprintf
+#define debugging_env 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_event if(!debug_msg_enabled[22]) ; else fprintf
+#define debugging_event debug_msg_enabled[22]
 #else
 #ifdef DEBUG_EVENT
 #define dprintf_event fprintf
@@ -836,8 +870,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_exec if(!debug_msg_enabled[22]) ; else fprintf
-#define debugging_exec debug_msg_enabled[22]
+#define dprintf_exec if(!debug_msg_enabled[23]) ; else fprintf
+#define debugging_exec debug_msg_enabled[23]
 #else
 #ifdef DEBUG_EXEC
 #define dprintf_exec fprintf
@@ -849,8 +883,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_file if(!debug_msg_enabled[23]) ; else fprintf
-#define debugging_file debug_msg_enabled[23]
+#define dprintf_file if(!debug_msg_enabled[24]) ; else fprintf
+#define debugging_file debug_msg_enabled[24]
 #else
 #ifdef DEBUG_FILE
 #define dprintf_file fprintf
@@ -862,8 +896,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_fixup if(!debug_msg_enabled[24]) ; else fprintf
-#define debugging_fixup debug_msg_enabled[24]
+#define dprintf_fixup if(!debug_msg_enabled[25]) ; else fprintf
+#define debugging_fixup debug_msg_enabled[25]
 #else
 #ifdef DEBUG_FIXUP
 #define dprintf_fixup fprintf
@@ -875,8 +909,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_font if(!debug_msg_enabled[25]) ; else fprintf
-#define debugging_font debug_msg_enabled[25]
+#define dprintf_font if(!debug_msg_enabled[26]) ; else fprintf
+#define debugging_font debug_msg_enabled[26]
 #else
 #ifdef DEBUG_FONT
 #define dprintf_font fprintf
@@ -888,8 +922,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_gdi if(!debug_msg_enabled[26]) ; else fprintf
-#define debugging_gdi debug_msg_enabled[26]
+#define dprintf_gdi if(!debug_msg_enabled[27]) ; else fprintf
+#define debugging_gdi debug_msg_enabled[27]
 #else
 #ifdef DEBUG_GDI
 #define dprintf_gdi fprintf
@@ -901,8 +935,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_global if(!debug_msg_enabled[27]) ; else fprintf
-#define debugging_global debug_msg_enabled[27]
+#define dprintf_global if(!debug_msg_enabled[28]) ; else fprintf
+#define debugging_global debug_msg_enabled[28]
 #else
 #ifdef DEBUG_GLOBAL
 #define dprintf_global fprintf
@@ -914,8 +948,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_graphics if(!debug_msg_enabled[28]) ; else fprintf
-#define debugging_graphics debug_msg_enabled[28]
+#define dprintf_graphics if(!debug_msg_enabled[29]) ; else fprintf
+#define debugging_graphics debug_msg_enabled[29]
 #else
 #ifdef DEBUG_GRAPHICS
 #define dprintf_graphics fprintf
@@ -927,8 +961,21 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_icon if(!debug_msg_enabled[29]) ; else fprintf
-#define debugging_icon debug_msg_enabled[29]
+#define dprintf_hook if(!debug_msg_enabled[30]) ; else fprintf
+#define debugging_hook debug_msg_enabled[30]
+#else
+#ifdef DEBUG_HOOK
+#define dprintf_hook fprintf
+#define debugging_hook 1
+#else
+#define dprintf_hook while(0) fprintf
+#define debugging_hook 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_icon if(!debug_msg_enabled[31]) ; else fprintf
+#define debugging_icon debug_msg_enabled[31]
 #else
 #ifdef DEBUG_ICON
 #define dprintf_icon fprintf
@@ -940,8 +987,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_int if(!debug_msg_enabled[30]) ; else fprintf
-#define debugging_int debug_msg_enabled[30]
+#define dprintf_int if(!debug_msg_enabled[32]) ; else fprintf
+#define debugging_int debug_msg_enabled[32]
 #else
 #ifdef DEBUG_INT
 #define dprintf_int fprintf
@@ -953,8 +1000,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_key if(!debug_msg_enabled[31]) ; else fprintf
-#define debugging_key debug_msg_enabled[31]
+#define dprintf_key if(!debug_msg_enabled[33]) ; else fprintf
+#define debugging_key debug_msg_enabled[33]
 #else
 #ifdef DEBUG_KEY
 #define dprintf_key fprintf
@@ -966,8 +1013,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_keyboard if(!debug_msg_enabled[32]) ; else fprintf
-#define debugging_keyboard debug_msg_enabled[32]
+#define dprintf_keyboard if(!debug_msg_enabled[34]) ; else fprintf
+#define debugging_keyboard debug_msg_enabled[34]
 #else
 #ifdef DEBUG_KEYBOARD
 #define dprintf_keyboard fprintf
@@ -979,8 +1026,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_ldt if(!debug_msg_enabled[33]) ; else fprintf
-#define debugging_ldt debug_msg_enabled[33]
+#define dprintf_ldt if(!debug_msg_enabled[35]) ; else fprintf
+#define debugging_ldt debug_msg_enabled[35]
 #else
 #ifdef DEBUG_LDT
 #define dprintf_ldt fprintf
@@ -992,8 +1039,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_listbox if(!debug_msg_enabled[34]) ; else fprintf
-#define debugging_listbox debug_msg_enabled[34]
+#define dprintf_listbox if(!debug_msg_enabled[36]) ; else fprintf
+#define debugging_listbox debug_msg_enabled[36]
 #else
 #ifdef DEBUG_LISTBOX
 #define dprintf_listbox fprintf
@@ -1005,8 +1052,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_local if(!debug_msg_enabled[35]) ; else fprintf
-#define debugging_local debug_msg_enabled[35]
+#define dprintf_local if(!debug_msg_enabled[37]) ; else fprintf
+#define debugging_local debug_msg_enabled[37]
 #else
 #ifdef DEBUG_LOCAL
 #define dprintf_local fprintf
@@ -1018,8 +1065,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_malloc if(!debug_msg_enabled[36]) ; else fprintf
-#define debugging_malloc debug_msg_enabled[36]
+#define dprintf_malloc if(!debug_msg_enabled[38]) ; else fprintf
+#define debugging_malloc debug_msg_enabled[38]
 #else
 #ifdef DEBUG_MALLOC
 #define dprintf_malloc fprintf
@@ -1031,8 +1078,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mci if(!debug_msg_enabled[37]) ; else fprintf
-#define debugging_mci debug_msg_enabled[37]
+#define dprintf_mci if(!debug_msg_enabled[39]) ; else fprintf
+#define debugging_mci debug_msg_enabled[39]
 #else
 #ifdef DEBUG_MCI
 #define dprintf_mci fprintf
@@ -1044,8 +1091,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mcianim if(!debug_msg_enabled[38]) ; else fprintf
-#define debugging_mcianim debug_msg_enabled[38]
+#define dprintf_mcianim if(!debug_msg_enabled[40]) ; else fprintf
+#define debugging_mcianim debug_msg_enabled[40]
 #else
 #ifdef DEBUG_MCIANIM
 #define dprintf_mcianim fprintf
@@ -1057,8 +1104,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mciwave if(!debug_msg_enabled[39]) ; else fprintf
-#define debugging_mciwave debug_msg_enabled[39]
+#define dprintf_mciwave if(!debug_msg_enabled[41]) ; else fprintf
+#define debugging_mciwave debug_msg_enabled[41]
 #else
 #ifdef DEBUG_MCIWAVE
 #define dprintf_mciwave fprintf
@@ -1070,8 +1117,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mdi if(!debug_msg_enabled[40]) ; else fprintf
-#define debugging_mdi debug_msg_enabled[40]
+#define dprintf_mdi if(!debug_msg_enabled[42]) ; else fprintf
+#define debugging_mdi debug_msg_enabled[42]
 #else
 #ifdef DEBUG_MDI
 #define dprintf_mdi fprintf
@@ -1083,8 +1130,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_menu if(!debug_msg_enabled[41]) ; else fprintf
-#define debugging_menu debug_msg_enabled[41]
+#define dprintf_menu if(!debug_msg_enabled[43]) ; else fprintf
+#define debugging_menu debug_msg_enabled[43]
 #else
 #ifdef DEBUG_MENU
 #define dprintf_menu fprintf
@@ -1096,8 +1143,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_menucalc if(!debug_msg_enabled[42]) ; else fprintf
-#define debugging_menucalc debug_msg_enabled[42]
+#define dprintf_menucalc if(!debug_msg_enabled[44]) ; else fprintf
+#define debugging_menucalc debug_msg_enabled[44]
 #else
 #ifdef DEBUG_MENUCALC
 #define dprintf_menucalc fprintf
@@ -1109,8 +1156,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_message if(!debug_msg_enabled[43]) ; else fprintf
-#define debugging_message debug_msg_enabled[43]
+#define dprintf_message if(!debug_msg_enabled[45]) ; else fprintf
+#define debugging_message debug_msg_enabled[45]
 #else
 #ifdef DEBUG_MESSAGE
 #define dprintf_message fprintf
@@ -1122,8 +1169,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_metafile if(!debug_msg_enabled[44]) ; else fprintf
-#define debugging_metafile debug_msg_enabled[44]
+#define dprintf_metafile if(!debug_msg_enabled[46]) ; else fprintf
+#define debugging_metafile debug_msg_enabled[46]
 #else
 #ifdef DEBUG_METAFILE
 #define dprintf_metafile fprintf
@@ -1135,8 +1182,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_midi if(!debug_msg_enabled[45]) ; else fprintf
-#define debugging_midi debug_msg_enabled[45]
+#define dprintf_midi if(!debug_msg_enabled[47]) ; else fprintf
+#define debugging_midi debug_msg_enabled[47]
 #else
 #ifdef DEBUG_MIDI
 #define dprintf_midi fprintf
@@ -1148,8 +1195,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mmio if(!debug_msg_enabled[46]) ; else fprintf
-#define debugging_mmio debug_msg_enabled[46]
+#define dprintf_mmio if(!debug_msg_enabled[48]) ; else fprintf
+#define debugging_mmio debug_msg_enabled[48]
 #else
 #ifdef DEBUG_MMIO
 #define dprintf_mmio fprintf
@@ -1161,8 +1208,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mmsys if(!debug_msg_enabled[47]) ; else fprintf
-#define debugging_mmsys debug_msg_enabled[47]
+#define dprintf_mmsys if(!debug_msg_enabled[49]) ; else fprintf
+#define debugging_mmsys debug_msg_enabled[49]
 #else
 #ifdef DEBUG_MMSYS
 #define dprintf_mmsys fprintf
@@ -1174,8 +1221,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mmtime if(!debug_msg_enabled[48]) ; else fprintf
-#define debugging_mmtime debug_msg_enabled[48]
+#define dprintf_mmtime if(!debug_msg_enabled[50]) ; else fprintf
+#define debugging_mmtime debug_msg_enabled[50]
 #else
 #ifdef DEBUG_MMTIME
 #define dprintf_mmtime fprintf
@@ -1187,8 +1234,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_module if(!debug_msg_enabled[49]) ; else fprintf
-#define debugging_module debug_msg_enabled[49]
+#define dprintf_module if(!debug_msg_enabled[51]) ; else fprintf
+#define debugging_module debug_msg_enabled[51]
 #else
 #ifdef DEBUG_MODULE
 #define dprintf_module fprintf
@@ -1200,8 +1247,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_msg if(!debug_msg_enabled[50]) ; else fprintf
-#define debugging_msg debug_msg_enabled[50]
+#define dprintf_msg if(!debug_msg_enabled[52]) ; else fprintf
+#define debugging_msg debug_msg_enabled[52]
 #else
 #ifdef DEBUG_MSG
 #define dprintf_msg fprintf
@@ -1213,8 +1260,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_nonclient if(!debug_msg_enabled[51]) ; else fprintf
-#define debugging_nonclient debug_msg_enabled[51]
+#define dprintf_nonclient if(!debug_msg_enabled[53]) ; else fprintf
+#define debugging_nonclient debug_msg_enabled[53]
 #else
 #ifdef DEBUG_NONCLIENT
 #define dprintf_nonclient fprintf
@@ -1226,8 +1273,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_ole if(!debug_msg_enabled[52]) ; else fprintf
-#define debugging_ole debug_msg_enabled[52]
+#define dprintf_ole if(!debug_msg_enabled[54]) ; else fprintf
+#define debugging_ole debug_msg_enabled[54]
 #else
 #ifdef DEBUG_OLE
 #define dprintf_ole fprintf
@@ -1239,8 +1286,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_palette if(!debug_msg_enabled[53]) ; else fprintf
-#define debugging_palette debug_msg_enabled[53]
+#define dprintf_palette if(!debug_msg_enabled[55]) ; else fprintf
+#define debugging_palette debug_msg_enabled[55]
 #else
 #ifdef DEBUG_PALETTE
 #define dprintf_palette fprintf
@@ -1252,8 +1299,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_profile if(!debug_msg_enabled[54]) ; else fprintf
-#define debugging_profile debug_msg_enabled[54]
+#define dprintf_profile if(!debug_msg_enabled[56]) ; else fprintf
+#define debugging_profile debug_msg_enabled[56]
 #else
 #ifdef DEBUG_PROFILE
 #define dprintf_profile fprintf
@@ -1265,8 +1312,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_prop if(!debug_msg_enabled[55]) ; else fprintf
-#define debugging_prop debug_msg_enabled[55]
+#define dprintf_prop if(!debug_msg_enabled[57]) ; else fprintf
+#define debugging_prop debug_msg_enabled[57]
 #else
 #ifdef DEBUG_PROP
 #define dprintf_prop fprintf
@@ -1278,8 +1325,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_reg if(!debug_msg_enabled[56]) ; else fprintf
-#define debugging_reg debug_msg_enabled[56]
+#define dprintf_reg if(!debug_msg_enabled[58]) ; else fprintf
+#define debugging_reg debug_msg_enabled[58]
 #else
 #ifdef DEBUG_REG
 #define dprintf_reg fprintf
@@ -1291,8 +1338,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_region if(!debug_msg_enabled[57]) ; else fprintf
-#define debugging_region debug_msg_enabled[57]
+#define dprintf_region if(!debug_msg_enabled[59]) ; else fprintf
+#define debugging_region debug_msg_enabled[59]
 #else
 #ifdef DEBUG_REGION
 #define dprintf_region fprintf
@@ -1304,8 +1351,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_relay if(!debug_msg_enabled[58]) ; else fprintf
-#define debugging_relay debug_msg_enabled[58]
+#define dprintf_relay if(!debug_msg_enabled[60]) ; else fprintf
+#define debugging_relay debug_msg_enabled[60]
 #else
 #ifdef DEBUG_RELAY
 #define dprintf_relay fprintf
@@ -1317,8 +1364,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_resource if(!debug_msg_enabled[59]) ; else fprintf
-#define debugging_resource debug_msg_enabled[59]
+#define dprintf_resource if(!debug_msg_enabled[61]) ; else fprintf
+#define debugging_resource debug_msg_enabled[61]
 #else
 #ifdef DEBUG_RESOURCE
 #define dprintf_resource fprintf
@@ -1330,8 +1377,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_scroll if(!debug_msg_enabled[60]) ; else fprintf
-#define debugging_scroll debug_msg_enabled[60]
+#define dprintf_scroll if(!debug_msg_enabled[62]) ; else fprintf
+#define debugging_scroll debug_msg_enabled[62]
 #else
 #ifdef DEBUG_SCROLL
 #define dprintf_scroll fprintf
@@ -1343,8 +1390,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_selector if(!debug_msg_enabled[61]) ; else fprintf
-#define debugging_selector debug_msg_enabled[61]
+#define dprintf_selector if(!debug_msg_enabled[63]) ; else fprintf
+#define debugging_selector debug_msg_enabled[63]
 #else
 #ifdef DEBUG_SELECTOR
 #define dprintf_selector fprintf
@@ -1356,8 +1403,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_sem if(!debug_msg_enabled[62]) ; else fprintf
-#define debugging_sem debug_msg_enabled[62]
+#define dprintf_sem if(!debug_msg_enabled[64]) ; else fprintf
+#define debugging_sem debug_msg_enabled[64]
 #else
 #ifdef DEBUG_SEM
 #define dprintf_sem fprintf
@@ -1369,8 +1416,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_shm if(!debug_msg_enabled[63]) ; else fprintf
-#define debugging_shm debug_msg_enabled[63]
+#define dprintf_shm if(!debug_msg_enabled[65]) ; else fprintf
+#define debugging_shm debug_msg_enabled[65]
 #else
 #ifdef DEBUG_SHM
 #define dprintf_shm fprintf
@@ -1382,8 +1429,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_stress if(!debug_msg_enabled[64]) ; else fprintf
-#define debugging_stress debug_msg_enabled[64]
+#define dprintf_stress if(!debug_msg_enabled[66]) ; else fprintf
+#define debugging_stress debug_msg_enabled[66]
 #else
 #ifdef DEBUG_STRESS
 #define dprintf_stress fprintf
@@ -1395,8 +1442,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_syscolor if(!debug_msg_enabled[65]) ; else fprintf
-#define debugging_syscolor debug_msg_enabled[65]
+#define dprintf_syscolor if(!debug_msg_enabled[67]) ; else fprintf
+#define debugging_syscolor debug_msg_enabled[67]
 #else
 #ifdef DEBUG_SYSCOLOR
 #define dprintf_syscolor fprintf
@@ -1408,8 +1455,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_task if(!debug_msg_enabled[66]) ; else fprintf
-#define debugging_task debug_msg_enabled[66]
+#define dprintf_task if(!debug_msg_enabled[68]) ; else fprintf
+#define debugging_task debug_msg_enabled[68]
 #else
 #ifdef DEBUG_TASK
 #define dprintf_task fprintf
@@ -1421,8 +1468,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_text if(!debug_msg_enabled[67]) ; else fprintf
-#define debugging_text debug_msg_enabled[67]
+#define dprintf_text if(!debug_msg_enabled[69]) ; else fprintf
+#define debugging_text debug_msg_enabled[69]
 #else
 #ifdef DEBUG_TEXT
 #define dprintf_text fprintf
@@ -1434,8 +1481,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_timer if(!debug_msg_enabled[68]) ; else fprintf
-#define debugging_timer debug_msg_enabled[68]
+#define dprintf_timer if(!debug_msg_enabled[70]) ; else fprintf
+#define debugging_timer debug_msg_enabled[70]
 #else
 #ifdef DEBUG_TIMER
 #define dprintf_timer fprintf
@@ -1447,8 +1494,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_toolhelp if(!debug_msg_enabled[69]) ; else fprintf
-#define debugging_toolhelp debug_msg_enabled[69]
+#define dprintf_toolhelp if(!debug_msg_enabled[71]) ; else fprintf
+#define debugging_toolhelp debug_msg_enabled[71]
 #else
 #ifdef DEBUG_TOOLHELP
 #define dprintf_toolhelp fprintf
@@ -1460,8 +1507,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_utility if(!debug_msg_enabled[70]) ; else fprintf
-#define debugging_utility debug_msg_enabled[70]
+#define dprintf_utility if(!debug_msg_enabled[72]) ; else fprintf
+#define debugging_utility debug_msg_enabled[72]
 #else
 #ifdef DEBUG_UTILITY
 #define dprintf_utility fprintf
@@ -1473,8 +1520,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_vxd if(!debug_msg_enabled[71]) ; else fprintf
-#define debugging_vxd debug_msg_enabled[71]
+#define dprintf_vxd if(!debug_msg_enabled[73]) ; else fprintf
+#define debugging_vxd debug_msg_enabled[73]
 #else
 #ifdef DEBUG_VXD
 #define dprintf_vxd fprintf
@@ -1486,8 +1533,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win if(!debug_msg_enabled[72]) ; else fprintf
-#define debugging_win debug_msg_enabled[72]
+#define dprintf_win if(!debug_msg_enabled[74]) ; else fprintf
+#define debugging_win debug_msg_enabled[74]
 #else
 #ifdef DEBUG_WIN
 #define dprintf_win fprintf
@@ -1499,8 +1546,21 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_winsock if(!debug_msg_enabled[73]) ; else fprintf
-#define debugging_winsock debug_msg_enabled[73]
+#define dprintf_win32 if(!debug_msg_enabled[75]) ; else fprintf
+#define debugging_win32 debug_msg_enabled[75]
+#else
+#ifdef DEBUG_WIN32
+#define dprintf_win32 fprintf
+#define debugging_win32 1
+#else
+#define dprintf_win32 while(0) fprintf
+#define debugging_win32 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_winsock if(!debug_msg_enabled[76]) ; else fprintf
+#define debugging_winsock debug_msg_enabled[76]
 #else
 #ifdef DEBUG_WINSOCK
 #define dprintf_winsock fprintf
@@ -1536,6 +1596,7 @@
     "driver",
     "edit",
     "enum",
+    "env",
     "event",
     "exec",
     "file",
@@ -1544,6 +1605,7 @@
     "gdi",
     "global",
     "graphics",
+    "hook",
     "icon",
     "int",
     "key",
@@ -1588,6 +1650,7 @@
     "utility",
     "vxd",
     "win",
+    "win32",
     "winsock",
     ""
 };
diff --git a/include/handle32.h b/include/handle32.h
new file mode 100644
index 0000000..f4e0d9e
--- /dev/null
+++ b/include/handle32.h
@@ -0,0 +1,87 @@
+#ifndef __WINE_HANDLE32_H
+#define __WINE_HANDLE32_H
+
+#include <malloc.h>
+
+/* The _*_OBJECT structures contain information needed about each
+ * particular type of handle.  This information is a combination of
+ * equivalent UNIX-style handles/descriptors and general information
+ * that the Win32 API might request.
+ *
+ * The KERNEL_OBJECT structure must be the first member of any specific
+ * kernel object type's structure.
+ */
+
+typedef struct {
+    unsigned long       magic;
+} KERNEL_OBJECT, *HANDLE32;
+
+typedef struct {
+    KERNEL_OBJECT       common;
+    unsigned long       thread_id;
+    unsigned long       process_id;
+} THREAD_OBJECT;
+
+typedef struct {
+    KERNEL_OBJECT       common;
+    unsigned long       process_id;
+    unsigned long       main_thread_id;
+} PROCESS_OBJECT;
+
+/* The FILE object includes things like disk files, pipes, and
+ * character devices (com ports, consoles, ...).
+ */
+typedef struct {
+    KERNEL_OBJECT       common;
+    int                 fd;                 /* UNIX fd */
+    int                 type;               /* FILE_TYPE_* */
+    unsigned long       misc_flags;         /* special flags */
+    unsigned long       access_flags;       /* UNIX access flags */
+    unsigned long       create_flags;       /* UNIX creation flags */
+} FILE_OBJECT;
+
+typedef struct {
+    KERNEL_OBJECT       common;
+} SEMAPHORE_OBJECT;
+
+typedef struct {
+    KERNEL_OBJECT       common;
+} EVENT_OBJECT;
+
+/* Should this even be here?
+ */
+typedef struct {
+    KERNEL_OBJECT       common;
+} REGKEY_OBJECT;
+
+/* Object number definitions.  These numbers are used to
+ * validate the kernel object by comparison against the
+ * object's 'magic' value.
+  */
+#define KERNEL_OBJECT_UNUSED    2404554046UL
+#define KERNEL_OBJECT_THREAD    (KERNEL_OBJECT_UNUSED + 1)
+#define KERNEL_OBJECT_PROCESS   (KERNEL_OBJECT_UNUSED + 2)
+#define KERNEL_OBJECT_FILE      (KERNEL_OBJECT_UNUSED + 3)
+#define KERNEL_OBJECT_SEMAPHORE (KERNEL_OBJECT_UNUSED + 4)
+#define KERNEL_OBJECT_EVENT     (KERNEL_OBJECT_UNUSED + 5)
+#define KERNEL_OBJECT_REGKEY    (KERNEL_OBJECT_UNUSED + 6)
+
+/* Define the invalid handle value
+ */
+#define INVALID_HANDLE_VALUE    ((HANDLE32)-1)
+
+/* Functions for checking kernel objects.
+ */
+int ValidateKernelObject(KERNEL_OBJECT *ptr);
+
+/* For now, CreateKernelObject and ReleaseKernelObject will
+ * simply map to malloc() and free().
+ */
+#define CreateKernelObject(size) (malloc(size))
+#define ReleaseKernelObject(ptr) (free(ptr))
+
+/* Prototypes for the Close*Handle functions
+ */
+int CloseFileHandle(FILE_OBJECT *hFile);
+
+#endif /* __WINE_HANDLE32_H */
diff --git a/include/hook.h b/include/hook.h
index bd91822..610b816 100644
--- a/include/hook.h
+++ b/include/hook.h
@@ -11,31 +11,28 @@
 #include "ldt.h"
 #include "callback.h"
 
+#ifndef WINELIB
+#pragma pack(1)
+#endif
+
   /* Hook data (pointed to by a HHOOK) */
 typedef struct
 {
-    HHOOK    next;   /* Next hook in chain */
-    HOOKPROC proc;   /* Hook procedure */
-    short    id;     /* Hook id (WH_xxx) */
-    HTASK    htask;  /* Task owning this hook */
+    HANDLE   next;               /* 00 Next hook in chain */
+    HOOKPROC proc WINE_PACKED;   /* 02 Hook procedure */
+    short    id;                 /* 06 Hook id (WH_xxx) */
+    HQUEUE   ownerQueue;         /* 08 Owner queue (0 for system hook) */
+    HMODULE  ownerModule;        /* 0a Owner module */
+    WORD     inHookProc;         /* 0c TRUE if in this->proc */
 } HOOKDATA;
 
+#ifndef WINELIB
+#pragma pack(4)
+#endif
 
-#define FIRST_HOOK  WH_MSGFILTER
-#define LAST_HOOK   WH_SHELL
+#define HOOK_MAGIC  ((int)'H' | (int)'K' << 8)  /* 'HK' */
 
-#define SYSTEM_HOOK(id)  (systemHooks[(id)-FIRST_HOOK])
-#define TASK_HOOK(id)    (taskHooks[(id)-FIRST_HOOK])
-#define INTERNAL_CALL_HOOK(hhook,code,wparam,lparam) \
-    ((hhook) ? CallHookProc(((HOOKDATA*)PTR_SEG_TO_LIN(hhook))->proc,\
-                            code, wparam, lparam) : 0)
-
-#define CALL_SYSTEM_HOOK(id,code,wparam,lparam) \
-    INTERNAL_CALL_HOOK(SYSTEM_HOOK(id),code,wparam,lparam)
-#define CALL_TASK_HOOK(id,code,wparam,lparam) \
-    INTERNAL_CALL_HOOK(TASK_HOOK(id),code,wparam,lparam)
-
-extern HHOOK systemHooks[];
-extern HHOOK taskHooks[];
+extern DWORD HOOK_CallHooks( short id, short code,
+                             WPARAM wParam, LPARAM lParam );
 
 #endif  /* HOOK_H */
diff --git a/include/kernel32.h b/include/kernel32.h
index 5fb595f..dd38cdc 100644
--- a/include/kernel32.h
+++ b/include/kernel32.h
@@ -2,6 +2,9 @@
  *
  * Win32 functions, structures, and types related to kernel functions
  */
+#ifndef __WINE_KERNEL32_H
+#define __WINE_KERNEL32_H
+
 #include <stddef.h>
 
 int KERN32_Init(void);
@@ -78,3 +81,54 @@
 #define TIME_ZONE_ID_STANDARD   1
 #define TIME_ZONE_ID_DAYLIGHT   2
 
+
+/* File object type definitions
+ */
+#define FILE_TYPE_UNKNOWN       0
+#define FILE_TYPE_DISK          1
+#define FILE_TYPE_CHAR          2
+#define FILE_TYPE_PIPE          3
+#define FILE_TYPE_REMOTE        32768
+
+/* File creation flags
+ */
+#define GENERIC_READ            0x80000000L
+#define GENERIC_WRITE           0x40000000L
+#define CREATE_NEW              1
+#define CREATE_ALWAYS           2
+#define OPEN_EXISTING           3
+#define OPEN_ALWAYS             4
+#define TRUNCATE_EXISTING       5
+
+/* Standard handle identifiers
+ */
+#define STD_INPUT_HANDLE        ((DWORD) -10)
+#define STD_OUTPUT_HANDLE       ((DWORD) -11)
+#define STD_ERROR_HANDLE        ((DWORD) -12)
+
+/* The security attributes structure (not filled in yet)
+ */
+typedef struct {
+    void *junk;
+} SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
+typedef struct
+{
+  int dwLowDateTime;
+  int dwHighDateTime;
+} FILETIME;
+
+typedef struct
+{
+  int dwFileAttributes;
+  FILETIME ftCreationTime;
+  FILETIME ftLastAccessTime;
+  FILETIME ftLastWriteTime;
+  int dwVolumeSerialNumber;
+  int nFileSizeHigh;
+  int nFileSizeLow;
+  int nNumberOfLinks;
+  int nFileIndexHigh;
+  int nFileIndexLow;
+} BY_HANDLE_FILE_INFORMATION ;
+
+#endif  /* __WINE_KERNEL32_H */
diff --git a/include/libres.h b/include/libres.h
new file mode 100644
index 0000000..68ada6f
--- /dev/null
+++ b/include/libres.h
@@ -0,0 +1,19 @@
+/*
+ * WINElib-Resources
+ */
+#ifndef __WINE_LIBRES_H
+#define __WINE_LIBRES_H
+
+#include "windows.h"
+
+#ifdef WINELIB
+HRSRC LIBRES_FindResource( HMODULE hModule, SEGPTR name, SEGPTR type );
+HGLOBAL LIBRES_LoadResource( HMODULE hModule, HRSRC hRsrc );
+LPSTR LIBRES_LockResource( HMODULE hModule, HGLOBAL handle );
+BOOL LIBRES_FreeResource( HMODULE hModule, HGLOBAL handle );
+INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc );
+DWORD LIBRES_SizeofResource( HMODULE hModule, HRSRC hRsrc );
+HGLOBAL LIBRES_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size );
+#endif
+
+#endif
diff --git a/include/listbox.h b/include/listbox.h
index 405a110..1ca0891 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -24,7 +24,7 @@
 	WORD    DrawCtlType;
         WORD    CtlID;
 	LPLISTSTRUCT lpFirst;
-	DWORD   dwStyle;
+	HWND	hSelf;
 	HWND    hParent;
 	HFONT   hFont;
 	BOOL    bRedrawFlag;
@@ -34,6 +34,7 @@
 	LPINT   TabStops;
 	HANDLE  hDrawItemStruct;
         BOOL    needMeasure;
+	WORD	HeapSel;
 /*	MDESC   *Heap; */
 } HEADLIST,*LPHEADLIST;
 
@@ -41,7 +42,7 @@
 extern void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent);
 extern void DestroyListBoxStruct(LPHEADLIST lphl);
 
-extern void ListBoxSendNotification(LPHEADLIST lphl,HWND hwnd, WORD code);
+extern void ListBoxSendNotification(LPHEADLIST lphl, WORD code);
 
 extern LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex);
 extern int ListMaxFirstVisible(LPHEADLIST lphl);
diff --git a/include/message.h b/include/message.h
index 10832ef..e604a41 100644
--- a/include/message.h
+++ b/include/message.h
@@ -9,6 +9,10 @@
 
 #include "windows.h"
 
+#ifndef WINELIB
+#pragma pack(1)
+#endif
+
   /* Message as stored in the queue (contains the extraInfo field) */
 typedef struct tagQMSG
 {
@@ -19,30 +23,45 @@
 
 typedef struct tagMESSAGEQUEUE
 {
-  WORD      next;
-  HTASK     hTask;                  /* hTask owning the queue                */
-  WORD      msgSize;                /* Size of messages in the queue         */
-  WORD      msgCount;               /* Number of waiting messages            */
-  WORD      nextMessage;            /* Next message to be retrieved          */
-  WORD      nextFreeMessage;        /* Next available slot in the queue      */
-  WORD      queueSize;              /* Size of the queue                     */
-  DWORD     GetMessageTimeVal;      /* Value returned by GetMessageTime      */
-  DWORD     GetMessagePosVal;       /* Value returned by GetMessagePos       */
-  DWORD     GetMessageExtraInfoVal; /* Value returned by GetMessageExtraInfo */
-  LPARAM    lParam;                 /* Next four values set by SendMessage   */
-  WPARAM    wParam;
-  UINT      msg;
-  HWND      hWnd;
-  WORD      wPostQMsg;              /* PostQuitMessage flag                  */
-  WORD      wExitCode;              /* PostQuitMessage exit code             */
-  WORD      InSendMessageHandle;    /* Handle of task that sent a message    */
-  WORD      wPaintCount;            /* Number of WM_PAINT needed             */
-  WORD      wTimerCount;            /* Number of timers for this application */
-  WORD      tempStatus;             /* State reset by GetQueueStatus         */
-  WORD      status;                 /* Queue state                           */
-  QMSG      messages[1];            /* Queue messages                        */
+  WORD      next;                   /* 00 Next queue */
+  HTASK     hTask;                  /* 02 hTask owning the queue */
+  WORD      msgSize;                /* 04 Size of messages in the queue */
+  WORD      msgCount;               /* 06 Number of waiting messages */
+  WORD      nextMessage;            /* 08 Next message to be retrieved */
+  WORD      nextFreeMessage;        /* 0a Next available slot in the queue */
+  WORD      queueSize;              /* 0c Size of the queue */
+  DWORD     GetMessageTimeVal WINE_PACKED;  /* 0e Value for GetMessageTime */
+  DWORD     GetMessagePosVal WINE_PACKED;   /* 12 Value for GetMessagePos */
+  WORD      reserved1;              /* 16 Unknown */
+  DWORD     GetMessageExtraInfoVal; /* 18 Value for GetMessageExtraInfo */
+  WORD      reserved2;              /* 1c Unknown */
+  LPARAM    lParam WINE_PACKED;     /* 1e Next 4 values set by SendMessage */
+  WPARAM    wParam;                 /* 22 */
+  UINT      msg;                    /* 24 */
+  HWND      hWnd;                   /* 26 */
+  DWORD     SendMessageReturn;      /* 28 Return value for SendMessage */
+  WORD      wPostQMsg;              /* 2c PostQuitMessage flag */
+  WORD      wExitCode;              /* 2e PostQuitMessage exit code */
+  WORD      reserved3[3];           /* 30 Unknown */
+  WORD      wWinVersion;            /* 36 Expected Windows version */
+  HQUEUE    InSendMessageHandle;    /* 38 Queue of task that sent a message */
+  HTASK     hSendingTask;           /* 3a Handle of task that sent a message */
+  HTASK     hPrevSendingTask;       /* 3c Handle of previous sender */
+  WORD      wPaintCount;            /* 3e Number of WM_PAINT needed */
+  WORD      wTimerCount;            /* 40 Number of timers for this task */
+  WORD      tempStatus;             /* 42 State reset by GetQueueStatus */
+  WORD      status;                 /* 44 Queue state */
+  WORD      wakeMask;               /* 46 Task wake-up mask */
+  WORD      SendMsgReturnPtrs[3];   /* 48 Near ptr to return values (?) */
+  HANDLE    hCurHook;               /* 4e Current hook */
+  HANDLE    hooks[WH_NB_HOOKS];     /* 50 Task hooks list */
+  WORD      reserved4[3];           /* 68 Unknown */
+  QMSG      messages[1];            /* 6e Queue messages */
 } MESSAGEQUEUE;
 
+#ifndef WINELIB
+#pragma pack(4)
+#endif
 
 extern void MSG_IncPaintCount( HANDLE hQueue );
 extern void MSG_DecPaintCount( HANDLE hQueue );
diff --git a/include/msdos.h b/include/msdos.h
index 6861971..5ee696a 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -5,11 +5,12 @@
 #include <windows.h>
 #include "comm.h"
 
+#define WINE_PATH_LENGTH 256
 struct dosdirent {
 	int  inuse;
 	DIR *ds;
-	char unixpath[256];
-	char filename[256];
+	char unixpath[WINE_PATH_LENGTH];
+	char filename[WINE_PATH_LENGTH];
 	char filemask[13];
 	char attribute;
 	char search_attribute;
@@ -17,6 +18,7 @@
 	long filetime;
         int telldirnum;
         short entnum;           /* Directory entry number */
+        struct dosdirent *next;
 };
 
 struct fcb {
diff --git a/include/options.h b/include/options.h
index 8ac6d2d..834713c 100644
--- a/include/options.h
+++ b/include/options.h
@@ -7,6 +7,18 @@
 #ifndef OPTIONS_H
 #define OPTIONS_H
 
+  /* Supported languages */
+typedef enum
+{
+    LANG_En,  /* English */
+    LANG_Es,  /* Spanish */
+    LANG_De,  /* German */
+    LANG_No,  /* Norwegian */
+    LANG_Fr,  /* French */
+    LANG_Fi,  /* Finnish */
+    LANG_Da   /* Danish */
+} WINE_LANGUAGE;
+
 struct options
 {
     char * desktopGeometry; /* NULL when no desktop */
@@ -21,6 +33,7 @@
 			       if write access is requested */
     int    enhanced;        /* Start Wine in enhanced mode */
     int    ipc;             /* Use IPC mechanisms */
+    WINE_LANGUAGE language; /* Current language */
 };
 
 extern struct options Options;
diff --git a/include/registers.h b/include/registers.h
index 777522d..2114b54 100644
--- a/include/registers.h
+++ b/include/registers.h
@@ -10,6 +10,8 @@
 #include <windows.h>
 #include "wine.h"
 
+#ifndef __svr4__
+
 #define EAX_reg(context)     ((context)->sc_eax)
 #define EBX_reg(context)     ((context)->sc_ebx)
 #define ECX_reg(context)     ((context)->sc_ecx)
@@ -63,4 +65,55 @@
 #define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
 #define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
 
+#else  /* __svr4__ */
+
+#define EAX_reg(context)      ((context)->uc_mcontext.gregs[EAX])
+#define EBX_reg(context)      ((context)->uc_mcontext.gregs[EBX])
+#define ECX_reg(context)      ((context)->uc_mcontext.gregs[ECX])
+#define EDX_reg(context)      ((context)->uc_mcontext.gregs[EDX])
+#define ESI_reg(context)      ((context)->uc_mcontext.gregs[ESI])
+#define EDI_reg(context)      ((context)->uc_mcontext.gregs[EDI])
+#define EBP_reg(context)      ((context)->uc_mcontext.gregs[EBP])
+                            
+#define AX_reg(context)      (*(WORD*)&((context)->uc_mcontext.gregs[EAX]))
+#define BX_reg(context)      (*(WORD*)&((context)->uc_mcontext.gregs[EBX]))
+#define CX_reg(context)      (*(WORD*)&((context)->uc_mcontext.gregs[ECX]))
+#define DX_reg(context)      (*(WORD*)&((context)->uc_mcontext.gregs[EDX]))
+#define SI_reg(context)      (*(WORD*)&((context)->uc_mcontext.gregs[ESI]))
+#define DI_reg(context)      (*(WORD*)&((context)->uc_mcontext.gregs[EDI]))
+#define BP_reg(context)      (*(WORD*)&((context)->uc_mcontext.gregs[EBP]))
+                            
+#define AL_reg(context)      (*(BYTE*)(&(context)->uc_mcontext.gregs[EAX]))
+#define AH_reg(context)      (*(((BYTE*)(&(context)->uc_mcontext.gregs[EAX])+1)))
+#define BL_reg(context)      (*(BYTE*)(&(context)->uc_mcontext.gregs[EBX]))
+#define BH_reg(context)      (*(((BYTE*)(&(context)->uc_mcontext.gregs[EBX])+1)))
+#define CL_reg(context)      (*(BYTE*)(&(context)->uc_mcontext.gregs[ECX]))
+#define CH_reg(context)      (*(((BYTE*)(&(context)->uc_mcontext.gregs[ECX])+1)))
+#define DL_reg(context)      (*(BYTE*)(&(context)->uc_mcontext.gregs[EDX]))
+#define DH_reg(context)      (*(((BYTE*)(&(context)->uc_mcontext.gregs[EDX])+1)))
+                            
+#define CS_reg(context)      ((context)->uc_mcontext.gregs[CS])
+#define DS_reg(context)      ((context)->uc_mcontext.gregs[DS])
+#define ES_reg(context)      ((context)->uc_mcontext.gregs[ES])
+#define SS_reg(context)      ((context)->uc_mcontext.gregs[SS])
+                            
+#define FS_reg(context)      ((context)->uc_mcontext.gregs[FS])
+#define GS_reg(context)      ((context)->uc_mcontext.gregs[GS])
+
+                            
+#define EFL_reg(context)     ((context)->uc_mcontext.gregs[EFL])
+#define FL_reg(context)      (*(WORD*)(&(context)->uc_mcontext.gregs[EFL]))
+
+                            
+#define EIP_reg(context)      ((context)->uc_mcontext.gregs[EIP])
+#define ESP_reg(context)     ((context)->uc_mcontext.gregs[R_ESP])
+                            
+#define IP_reg(context)      (*(WORD*)(&(context)->uc_mcontext.gregs[EIP]))
+#define SP_reg(context)      (*(WORD*)(&(context)->uc_mcontext.gregs[R_ESP]))
+                            
+#define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
+#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
+
+#endif  /* __svr4__ */
+
 #endif /* __WINE_REGISTERS_H */
diff --git a/include/stddebug.h b/include/stddebug.h
index 0b5a5c4..b5c8917 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -97,6 +97,7 @@
 #undef DEBUG_DRIVER
 #undef DEBUG_EDIT
 #undef DEBUG_ENUM
+#undef DEBUG_ENV
 #undef DEBUG_EVENT
 #undef DEBUG_EXEC
 #undef DEBUG_FILE
@@ -105,6 +106,7 @@
 #undef DEBUG_GDI
 #undef DEBUG_GLOBAL
 #undef DEBUG_GRAPHICS
+#undef DEBUG_HOOK
 #undef DEBUG_ICON
 #undef DEBUG_INT
 #undef DEBUG_KEY
@@ -149,6 +151,7 @@
 #undef DEBUG_UTILITY
 #undef DEBUG_VXD
 #undef DEBUG_WIN
+#undef DEBUG_WIN32
 #undef DEBUG_WINSOCK
 #endif
 
@@ -174,6 +177,7 @@
 #define DEBUG_DRIVER
 #define DEBUG_EDIT
 #define DEBUG_ENUM
+#define DEBUG_ENV
 #define DEBUG_EVENT
 #define DEBUG_EXEC
 #define DEBUG_FILE
@@ -182,6 +186,7 @@
 #define DEBUG_GDI
 #define DEBUG_GLOBAL
 #define DEBUG_GRAPHICS
+#define DEBUG_HOOK
 #define DEBUG_ICON
 #define DEBUG_INT
 #define DEBUG_KEY
@@ -226,5 +231,6 @@
 #define DEBUG_UTILITY
 #define DEBUG_VXD
 #define DEBUG_WIN
+#define DEBUG_WIN32
 #define DEBUG_WINSOCK
 #endif
diff --git a/include/winbase.h b/include/winbase.h
new file mode 100644
index 0000000..38f5e3c
--- /dev/null
+++ b/include/winbase.h
@@ -0,0 +1,124 @@
+#ifndef _WINBASE_H
+#define _WINBASE_H
+
+
+
+#ifdef UNICODE
+#define LoadAccelerators LoadAcceleratorsW
+#define TranslateAccelat
+#else
+#define LoadAccelerators LoadAcceleratorsA
+#endif
+
+
+#define INVALID_HANDLE_VALUE ((HANDLE) -1)
+
+#define WAIT_FAILED		0xffffffff
+#define WAIT_OBJECT_0		0
+#define WAIT_ABANDONED		STATUS_ABANDONED_WAIT_0
+#define WAIT_ABANDONED_0	STATUS_ABANDONED_WAIT_0
+#define WAIT_TIMEOUT		STATUS_TIMEOUT
+
+#define MEM_COMMIT      0x1000
+#define MEM_RESERVE	0x2000
+#define MEM_TOPDOWN	0x100000
+
+#define MEM_RELEASE	0x8000
+
+#define	PAGE_NOACCESS		0x01
+#define	PAGE_READONLY		0x02
+#define	PAGE_READWRITE		0x04
+#define	PAGE_WRITECOPY		0x08
+#define	PAGE_EXECUTE		0x10
+#define	PAGE_EXECUTE_READ	0x20
+#define	PAGE_EXECUTE_READWRITE	0x40
+#define	PAGE_EXECUTE_WRITECOPY	0x80
+#define	PAGE_GUARD		0x100
+#define	PAGE_NOCACHE		0x200
+
+HANDLE WINAPI OpenProcess(DWORD access, BOOL inherit, DWORD id);
+int WINAPI GetCurrentProcessId(void);
+int WINAPI TerminateProcess(HANDLE h, int ret);
+
+WINAPI void *  VirtualAlloc (void *addr,DWORD size,DWORD type,DWORD protect);
+
+struct _EXCEPTION_POINTERS;
+
+typedef LONG (TOP_LEVEL_EXCEPTION_FILTER)(struct _EXCEPTION_POINTERS *);
+
+WINAPI  TOP_LEVEL_EXCEPTION_FILTER *SetUnhandledExceptionFilter(TOP_LEVEL_EXCEPTION_FILTER *func);
+
+/*WINAPI int  SetErrorMode(int);*/
+
+#define STATUS_WAIT_0                    0x00000000    
+#define STATUS_ABANDONED_WAIT_0          0x00000080    
+#define STATUS_USER_APC                  0x000000C0    
+#define STATUS_TIMEOUT                   0x00000102    
+#define STATUS_PENDING                   0x00000103    
+#define STATUS_GUARD_PAGE_VIOLATION      0x80000001    
+#define STATUS_DATATYPE_MISALIGNMENT     0x80000002    
+#define STATUS_BREAKPOINT                0x80000003    
+#define STATUS_SINGLE_STEP               0x80000004    
+#define STATUS_ACCESS_VIOLATION          0xC0000005    
+#define STATUS_IN_PAGE_ERROR             0xC0000006    
+#define STATUS_NO_MEMORY                 0xC0000017    
+#define STATUS_ILLEGAL_INSTRUCTION       0xC000001D    
+#define STATUS_NONCONTINUABLE_EXCEPTION  0xC0000025    
+#define STATUS_INVALID_DISPOSITION       0xC0000026    
+#define STATUS_ARRAY_BOUNDS_EXCEEDED     0xC000008C    
+#define STATUS_FLOAT_DENORMAL_OPERAND    0xC000008D    
+#define STATUS_FLOAT_DIVIDE_BY_ZERO      0xC000008E    
+#define STATUS_FLOAT_INEXACT_RESULT      0xC000008F    
+#define STATUS_FLOAT_INVALID_OPERATION   0xC0000090    
+#define STATUS_FLOAT_OVERFLOW            0xC0000091    
+#define STATUS_FLOAT_STACK_CHECK         0xC0000092    
+#define STATUS_FLOAT_UNDERFLOW           0xC0000093    
+#define STATUS_INTEGER_DIVIDE_BY_ZERO    0xC0000094    
+#define STATUS_INTEGER_OVERFLOW          0xC0000095    
+#define STATUS_PRIVILEGED_INSTRUCTION    0xC0000096    
+#define STATUS_STACK_OVERFLOW            0xC00000FD    
+#define STATUS_CONTROL_C_EXIT            0xC000013A    
+
+#define DUPLICATE_CLOSE_SOURCE		0x00000001
+#define DUPLICATE_SAME_ACCESS		0x00000002
+
+typedef struct 
+{
+  int type;
+} exception;
+
+typedef struct 
+{
+  int pad[39];
+  int edi;
+  int esi;
+  int ebx;
+  int edx;
+  int ecx;
+  int eax;
+
+  int ebp;
+  int eip;
+  int cs;
+  int eflags;
+  int esp;
+  int ss;
+} exception_info;
+
+#endif
+
+
+/*DWORD WINAPI GetVersion( void );*/
+
+int
+WINAPI 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 *);
+#define FreeModule(hLibModule) FreeLibrary((hLibModule))
+#define MakeProcInstance(lpProc,hInstance) (lpProc)
+#define FreeProcInstance(lpProc) (lpProc)
diff --git a/include/wincon.h b/include/wincon.h
new file mode 100644
index 0000000..c10560c
--- /dev/null
+++ b/include/wincon.h
@@ -0,0 +1,335 @@
+#ifndef _WINCON_H_
+#define _WINCON_H_
+
+
+#ifdef UNICODE
+#define FillConsoleOutputCharacter FillConsoleOutputCharacterW
+#define GetConsoleTitle GetConsoleTitleW
+#define PeekConsoleInput PeekConsoleInputW
+#define ReadConsole ReadConsoleW
+#define ReadConsoleInput ReadConsoleInputW
+#define ReadConsoleOutput ReadConsoleOutputW
+#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterW
+#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferW
+#define SetConsoleTitle SetConsoleTitleW
+#define WriteConsole WriteConsoleW
+#define WriteConsoleInput WriteConsoleInputW
+#define WriteConsoleOutput WriteConsoleOutputW
+#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterW
+#else
+#define FillConsoleOutputCharacter FillConsoleOutputCharacterA
+#define GetConsoleTitle GetConsoleTitleA
+#define PeekConsoleInput PeekConsoleInputA
+#define ReadConsole ReadConsoleA
+#define ReadConsoleInput ReadConsoleInputA
+#define ReadConsoleOutput ReadConsoleOutputA
+#define ReadConsoleOutputCharacter ReadConsoleOutputCharacterA
+#define ScrollConsoleScreenBuffer ScrollConsoleScreenBufferA
+#define SetConsoleTitle SetConsoleTitleA
+#define WriteConsole WriteConsoleA
+#define WriteConsoleInput WriteConsoleInputA
+#define WriteConsoleOutput WriteConsoleOutputA
+#define WriteConsoleOutputCharacter WriteConsoleOutputCharacterA
+#endif
+
+
+
+#if 0
+
+typedef struct
+  {
+    int bKeyDown;
+    WORD wRepeatCount;
+    WORD wVirtualKeyCode;
+    WORD wVirtualScanCode;
+
+    char AsciiChar;
+char pad;
+#if 0
+    union
+      {
+	WCHAR UnicodeChar;
+	CHAR AsciiChar;
+      }
+    uChar;
+#endif
+    DWORD dwControlKeyState;
+  } __attribute__ ((packed)) KEY_EVENT_RECORD;
+
+
+
+#define RIGHT_ALT_PRESSED 0x1
+#define LEFT_ALT_PRESSED 0x2
+#define RIGHT_CTRL_PRESSED 0x4
+#define LEFT_CTRL_PRESSED 0x8
+#define SHIFT_PRESSED 0x10
+#define NUMLOCK_ON 0x20
+#define SCROLLLOCK_ON 0x40
+#define CAPSLOCK_ON 0x80
+#define ENHANCED_KEY 0x100
+
+typedef struct
+  {
+    COORD dwMousePosition;
+    DWORD dwButtonState;
+    DWORD dwControlKeyState;
+    DWORD dwEventFlags;
+  }
+MOUSE_EVENT_RECORD;
+
+#define CONSOLE_TEXTMODE_BUFFER 1
+
+
+#define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001
+#define RIGHTMOST_BUTTON_PRESSED 0x0002
+#define FROM_LEFT_2ND_BUTTON_PRESSED 0x0004
+#define FROM_LEFT_3RD_BUTTON_PRESSED 0x0008
+#define FROM_LEFT_4TH_BUTTON_PRESSED 0x0010
+
+
+
+
+#define MOUSE_MOVED 0x0001
+#define DOUBLE_CLICK 0x0002
+
+typedef struct
+  {
+    COORD size;
+  }
+WINDOW_BUFFER_SIZE_RECORD;
+
+typedef struct
+  {
+    UINT dwCommandId;
+  }
+MENU_EVENT_RECORD;
+
+typedef struct
+  {
+    BOOL bSetFocus;
+  }
+FOCUS_EVENT_RECORD;
+
+typedef struct
+  {
+    WORD EventType;
+    union
+      {
+	KEY_EVENT_RECORD KeyEvent;
+	MOUSE_EVENT_RECORD MouseEvent;
+	WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
+	MENU_EVENT_RECORD MenuEvent;
+	FOCUS_EVENT_RECORD FocusEvent;
+      }
+    Event;
+  }
+INPUT_RECORD;
+
+#define KEY_EVENT 0x1
+#define MOUSE_EVENT 0x2
+#define WINDOW_BUFFER_SIZE_EVENT 0x4
+#define MENU_EVENT 0x8
+#define FOCUS_EVENT 0x10
+
+typedef struct
+  {
+    union
+      {
+	WCHAR UnicodeChar;
+	CHAR AsciiChar;
+      }
+    Char;
+    WORD Attributes;
+  }
+CHAR_INFO;
+
+
+
+
+#define FOREGROUND_BLUE 0x01
+#define FOREGROUND_GREEN 0x02
+#define FOREGROUND_RED 0x04
+#define FOREGROUND_INTENSITY 0x08
+#define BACKGROUND_BLUE 0x10
+#define BACKGROUND_GREEN 0x20
+#define BACKGROUND_RED 0x40
+#define BACKGROUND_INTENSITY 0x80
+
+
+typedef struct
+  {
+    COORD dwSize;
+    COORD dwCursorPosition;
+    WORD wAttrs;
+    SMALL_RECT srWindow;
+    COORD dwMaximumWindowSize;
+  }
+CONSOLE_SCREEN_BUFFER_INFO;
+
+typedef struct
+  {
+    DWORD size;
+    BOOL bVisible;
+  }
+CONSOLE_CURSOR_INFO;
+
+#endif
+
+
+#define CTRL_C_EVENT 0
+#define CTRL_BREAK_EVENT 1
+#define CTRL_CLOSE_EVENT 2
+#define CTRL_LOGOFF_EVENT 5
+#define CTRL_SHUTDOWN_EVENT 6
+
+typedef BOOL HANDLER_ROUTINE (WORD ctrltype);
+
+#if 0
+
+#define ENABLE_PROCESSED_INPUT 0x01
+#define ENABLE_LINE_INPUT 0x02
+#define ENABLE_ECHO_INPUT 0x04
+#define ENABLE_WINDOW_INPUT 0x08
+#define ENABLE_MOUSE_INPUT 0x10
+
+#define ENABLE_PROCESSED_OUTPUT 0x01
+#define ENABLE_WRAP_AT_EOL_OUTPUT 0x02
+
+
+BOOL WINAPI 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);
+#endif
+#endif
+
diff --git a/include/windows.h b/include/windows.h
index 064434d..02542d0 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -173,10 +173,10 @@
 {
     HWND    hwnd;
     HWND    hwndInsertAfter;
-    int     x;
-    int     y;
-    int     cx;
-    int     cy;
+    INT     x;
+    INT     y;
+    INT     cx;
+    INT     cy;
     UINT    flags;
 } WINDOWPOS;
 
@@ -270,6 +270,7 @@
 /***** Window hooks *****/
 
   /* Hook values */
+#define WH_MSGFILTER	    (-1)
 #define WH_JOURNALRECORD    0
 #define WH_JOURNALPLAYBACK  1
 #define WH_KEYBOARD	    2
@@ -280,8 +281,11 @@
 #define WH_MOUSE	    7
 #define WH_HARDWARE	    8
 #define WH_DEBUG	    9
-#define WH_SHELL           10
-#define WH_MSGFILTER	    (-1)
+#define WH_SHELL            10
+
+#define WH_FIRST_HOOK       WH_MSGFILTER
+#define WH_LAST_HOOK        WH_SHELL
+#define WH_NB_HOOKS         (WH_LAST_HOOK-WH_FIRST_HOOK+1)
 
   /* Hook action codes */
 #define HC_ACTION           0
@@ -302,14 +306,6 @@
 #define MSGF_MAINLOOP       8
 #define MSGF_USER        4096
 
-  /* Journalling hook values */
-#define HC_GETNEXT	    1
-#define HC_SKIP 	    2
-#define HC_NOREMOVE	    3
-#define HC_NOREM	    HC_NOREMOVE
-#define HC_SYSMODALON       4
-#define HC_SYSMODALOFF	    5
-
   /* Journalling hook structure */
 typedef struct tagEVENTMSG
 {
@@ -532,7 +528,7 @@
     INT  bmWidthBytes;
     BYTE   bmPlanes;
     BYTE   bmBitsPixel;
-    void * bmBits WINE_PACKED;
+    SEGPTR bmBits WINE_PACKED;
 } BITMAP;
 
 typedef BITMAP *PBITMAP;
@@ -999,7 +995,7 @@
 
 typedef struct
 {
-    unsigned long bcSize;
+    DWORD bcSize;
     UINT bcWidth;
     UINT bcHeight;
     UINT bcPlanes;
@@ -1307,6 +1303,7 @@
 #define IDI_EXCLAMATION  MAKEINTRESOURCE(32515)
 #define IDI_ASTERISK     MAKEINTRESOURCE(32516)
 
+#define IDC_BUMMER	 MAKEINTRESOURCE(100)
 #define IDC_ARROW        MAKEINTRESOURCE(32512)
 #define IDC_IBEAM        MAKEINTRESOURCE(32513)
 #define IDC_WAIT         MAKEINTRESOURCE(32514)
@@ -1362,6 +1359,9 @@
 #define OBM_OLD_ZOOM        32756
 #define OBM_OLD_RESTORE     32755
 
+#define OCR_BUMMER	    100
+#define OCR_DRAGOBJECT	    101
+
 #define OCR_NORMAL          32512
 #define OCR_IBEAM           32513
 #define OCR_WAIT            32514
@@ -1405,6 +1405,28 @@
 #define DEFAULT_PALETTE     15
 #define SYSTEM_FIXED_FONT   16
 
+/* DragObject stuff */
+
+typedef struct tagDRAGINFO {
+	HWND 	hWnd;
+	HANDLE	hScope;
+	WORD	wFlags;
+	HANDLE  hList;
+	HANDLE  hOfStruct;
+	POINT	pt WINE_PACKED;
+	LONG	l  WINE_PACKED;
+}	DRAGINFO, FAR* LPDRAGINFO;
+
+#define DRAGOBJ_PROGRAM		0x0001
+#define DRAGOBJ_DATA		0x0002
+#define DRAGOBJ_DIRECTORY	0x0004
+#define DRAGOBJ_MULTIPLE	0x0008
+#define DRAGOBJ_EXTERNAL	0x8000
+
+#define DRAG_PRINT		0x544E5250
+#define DRAG_FILE		0x454C4946
+
+/* Messages */
 
 enum {  WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE,
 	WM_SETFOCUS, WM_KILLFOCUS, WM_SETVISIBLE, WM_ENABLE, WM_SETREDRAW, 
@@ -1523,6 +1545,7 @@
 #define WM_MDIGETACTIVE     0x0229
 #define WM_DROPOBJECT	    0x022A
 #define WM_QUERYDROPOBJECT  0x022B
+#define WM_BEGINDRAG	    0x022C
 #define WM_DRAGLOOP	    0x022D
 #define WM_DRAGSELECT	    0x022E
 #define WM_DRAGMOVE	    0x022F
@@ -1757,6 +1780,7 @@
 
 /* Window extended styles */
 #define WS_EX_DLGMODALFRAME    0x00000001L
+#define WS_EX_DRAGDETECT       0x00000002L
 #define WS_EX_NOPARENTNOTIFY   0x00000004L
 #define WS_EX_TOPMOST          0x00000008L
 #define WS_EX_ACCEPTFILES      0x00000010L
@@ -2073,7 +2097,7 @@
 
 #define WM_DRAWITEM         0x002B
 
-typedef struct tagDRAWITEMSTRUCT
+typedef struct
 {
     UINT        CtlType;
     UINT        CtlID;
@@ -2090,7 +2114,7 @@
 
 #define WM_MEASUREITEM      0x002C
 
-typedef struct tagMEASUREITEMSTRUCT
+typedef struct
 {
     UINT        CtlType;
     UINT        CtlID;
@@ -2104,7 +2128,7 @@
 
 #define WM_DELETEITEM       0x002D
 
-typedef struct tagDELETEITEMSTRUCT
+typedef struct
 {
     UINT       CtlType;
     UINT       CtlID;
@@ -2117,7 +2141,7 @@
 
 #define WM_COMPAREITEM      0x0039
 
-typedef struct tagCOMPAREITEMSTRUCT
+typedef struct
 {
     UINT        CtlType;
     UINT        CtlID;
@@ -2282,7 +2306,7 @@
 #define WM_CHANGECBCHAIN    0x030D
 
 /* Metafile header structure */
-typedef struct tagMETAHEADER
+typedef struct
 {
     WORD       mtType;
     WORD       mtHeaderSize;
@@ -2294,7 +2318,7 @@
 } METAHEADER;
 
 /* Metafile typical record structure */
-typedef struct tagMETARECORD
+typedef struct
 {
     DWORD      rdSize;
     WORD       rdFunction;
@@ -2304,7 +2328,7 @@
 typedef METARECORD *LPMETARECORD;
 
 /* Handle table structure */
-typedef struct tagHANDLETABLE
+typedef struct
 {
     HANDLE     objectHandle[1];
 } HANDLETABLE;
@@ -2312,7 +2336,7 @@
 typedef HANDLETABLE *LPHANDLETABLE;
 
 /* Clipboard metafile picture structure */
-typedef struct tagMETAFILEPICT
+typedef struct
 {
     INT        mm;
     INT        xExt;
@@ -2402,16 +2426,15 @@
 #define META_CREATEREGION            0x06FF
 
 /* Debugging support (DEBUG SYSTEM ONLY) */
-typedef struct tagWINDEBUGINFO
+typedef struct
 {
     UINT    flags;
-    DWORD   dwOptions;
-    DWORD   dwFilter;
-    char    achAllocModule[8];
-    DWORD   dwAllocBreak;
-    DWORD   dwAllocCount;
-} WINDEBUGINFO;
-typedef WINDEBUGINFO FAR* LPWINDEBUGINFO;
+    DWORD   dwOptions WINE_PACKED;
+    DWORD   dwFilter WINE_PACKED;
+    char    achAllocModule[8] WINE_PACKED;
+    DWORD   dwAllocBreak WINE_PACKED;
+    DWORD   dwAllocCount WINE_PACKED;
+} WINDEBUGINFO, *LPWINDEBUGINFO;
 
 /* WINDEBUGINFO flags values */
 #define WDI_OPTIONS         0x0001
@@ -2455,683 +2478,691 @@
 #pragma pack(4)
 #endif
 
-ATOM AddAtom(SEGPTR);
-ATOM DeleteAtom(ATOM);
-ATOM FindAtom(SEGPTR);
-ATOM GlobalAddAtom(SEGPTR);
-ATOM GlobalDeleteAtom(ATOM);
-ATOM GlobalFindAtom(SEGPTR);
-ATOM RegisterClass(LPWNDCLASS);
-BOOL AnyPopup(void);
-BOOL AppendMenu(HMENU,UINT,UINT,LPSTR);
-BOOL Arc(HDC,int,int,int,int,int,int,int,int);
-BOOL BitBlt(HDC,short,short,short,short,HDC,short,short,DWORD);
-BOOL BringWindowToTop(HWND);
-BOOL CallMsgFilter(SEGPTR,short);
-BOOL ChangeClipboardChain(HWND,HWND);
-BOOL ChangeMenu(HMENU,UINT,LPSTR,UINT,UINT);
-BOOL CheckMenuItem(HMENU,UINT,UINT);
-BOOL Chord(HDC,int,int,int,int,int,int,int,int);
-BOOL CloseClipboard(void);
-BOOL DPtoLP(HDC,LPPOINT,int);
-BOOL DeleteDC(HDC);
-BOOL DeleteMenu(HMENU,UINT,UINT);
-BOOL DeleteMetaFile(HMETAFILE);
-BOOL DeleteObject(HANDLE);
-BOOL DestroyCursor(HCURSOR);
-BOOL DestroyIcon(HICON);
-BOOL DestroyMenu(HMENU);
-BOOL DestroyWindow(HWND);
-BOOL DlgDirSelect(HWND,LPSTR,int);
-BOOL DlgDirSelectComboBox(HWND,LPSTR,int);
-BOOL DrawIcon(HDC,short,short,HICON);
-BOOL Ellipse(HDC,int,int,int,int);
-BOOL EmptyClipboard(void);
-BOOL EnableHardwareInput(BOOL);
-BOOL EnableMenuItem(HMENU,UINT,UINT);
-BOOL EnableScrollBar(HWND,INT,UINT);
-BOOL EnableWindow(HWND,BOOL);
-BOOL EndDeferWindowPos(HDWP);
-BOOL EnumChildWindows(HWND,FARPROC,LONG);
-BOOL EnumMetaFile(HDC,LOCALHANDLE,FARPROC,BYTE*);
-BOOL EnumTaskWindows(HANDLE,FARPROC,LONG);
-BOOL EnumWindows(FARPROC,LONG);
-BOOL EqualRect(LPRECT,LPRECT);
-BOOL EqualRgn(HRGN,HRGN);
-BOOL ExitWindows(DWORD,WORD);
-BOOL ExtFloodFill(HDC,INT,INT,COLORREF,WORD);
-BOOL ExtTextOut(HDC,short,short,WORD,LPRECT,LPSTR,WORD,LPINT);
-BOOL FillRgn(HDC,HRGN,HBRUSH);
-BOOL FlashWindow(HWND,BOOL);
-BOOL FloodFill(HDC,INT,INT,COLORREF);
-BOOL FrameRgn(HDC,HRGN,HBRUSH,int,int);
-BOOL FreeModule(HANDLE);
-BOOL FreeResource(HANDLE);
-BOOL GetBitmapDimensionEx(HBITMAP,LPSIZE);
-BOOL GetBrushOrgEx(HDC,LPPOINT);
-BOOL GetCharWidth(HDC,WORD,WORD,LPINT);
-BOOL GetClassInfo(HANDLE,SEGPTR,LPWNDCLASS);
-BOOL GetCurrentPositionEx(HDC,LPPOINT);
-BOOL GetInputState(void);
-BOOL GetMessage(SEGPTR,HWND,UINT,UINT);
-BOOL GetTextExtentPoint(HDC,LPSTR,short,LPSIZE);
-BOOL GetTextMetrics(HDC,LPTEXTMETRIC);
-BOOL GetUpdateRect(HWND,LPRECT,BOOL);
-BOOL GetViewportExtEx(HDC,LPPOINT);
-BOOL GetViewportOrgEx(HDC,LPPOINT);
-BOOL GetWinDebugInfo(LPWINDEBUGINFO,UINT);
-BOOL GetWindowExtEx(HDC,LPPOINT);
-BOOL GetWindowOrgEx(HDC,LPPOINT);
-BOOL GetWindowPlacement(HWND,LPWINDOWPLACEMENT);
-BOOL GlobalUnWire(HGLOBAL);
-BOOL GlobalUnlock(HGLOBAL);
-BOOL GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
-BOOL HiliteMenuItem(HWND,HMENU,UINT,UINT);
-BOOL InSendMessage(void);
-BOOL InsertMenu(HMENU,UINT,UINT,UINT,LPSTR);
-BOOL IntersectRect(LPRECT,LPRECT,LPRECT);
-BOOL InvertRgn(HDC,HRGN);
-BOOL IsBadCodePtr(SEGPTR);
-BOOL IsBadHugeReadPtr(SEGPTR,DWORD);
-BOOL IsBadHugeWritePtr(SEGPTR,DWORD);
-BOOL IsBadReadPtr(SEGPTR,WORD);
-BOOL IsBadStringPtr(SEGPTR,WORD);
-BOOL IsBadWritePtr(SEGPTR,WORD);
-BOOL IsCharAlpha(char);
-BOOL IsCharAlphaNumeric(char);
-BOOL IsCharLower(char);
-BOOL IsCharUpper(char);
-BOOL IsChild(HWND,HWND);
-BOOL IsClipboardFormatAvailable(WORD);
-BOOL IsDialogMessage(HWND,LPMSG);
-BOOL IsIconic(HWND);
-BOOL IsRectEmpty(LPRECT);
-BOOL IsTwoByteCharPrefix(char);
-BOOL IsWindow(HWND);
-BOOL IsWindowEnabled(HWND);
-BOOL IsWindowVisible(HWND);
-BOOL IsZoomed(HWND);
-BOOL KillSystemTimer(HWND,WORD);
-BOOL KillTimer(HWND,WORD);
-BOOL LPtoDP(HDC,LPPOINT,int);
-BOOL LineTo(HDC,short,short);
-BOOL LocalInit(HANDLE,WORD,WORD);
-BOOL LocalUnlock(HANDLE);
-BOOL ModifyMenu(HMENU,UINT,UINT,UINT,LPSTR);
-BOOL MoveToEx(HDC,short,short,LPPOINT);
-BOOL MoveWindow(HWND,short,short,short,short,BOOL);
-BOOL OemToAnsi(LPSTR,LPSTR);
-BOOL OffsetViewportOrgEx(HDC,short,short,LPPOINT);
-BOOL OffsetWindowOrgEx(HDC,short,short,LPPOINT);
-BOOL OpenClipboard(HWND);
-BOOL OpenIcon(HWND);
-BOOL PaintRgn(HDC,HRGN);
-BOOL PatBlt(HDC,short,short,short,short,DWORD);
-BOOL PeekMessage(LPMSG,HWND,WORD,WORD,WORD);
-BOOL Pie(HDC,int,int,int,int,int,int,int,int);
-BOOL PlayMetaFile(HDC,HANDLE);
-BOOL PolyPolygon(HDC,LPPOINT,LPINT,WORD);
-BOOL Polygon(HDC,LPPOINT,int);
-BOOL Polyline(HDC,LPPOINT,int);
-BOOL PostAppMessage(HANDLE,WORD,WORD,LONG);
-BOOL PostMessage(HWND,WORD,WORD,LONG);
-BOOL PtInRect(LPRECT,POINT);
-BOOL PtInRegion(HRGN,short,short);
-BOOL PtVisible(HDC,short,short);
-BOOL RectInRegion(HRGN,LPRECT);
-BOOL RectVisible(HDC,LPRECT);
-BOOL Rectangle(HDC,int,int,int,int);
-BOOL RedrawWindow(HWND,LPRECT,HRGN,UINT);
-BOOL RemoveFontResource(LPSTR);
-BOOL RemoveMenu(HMENU,UINT,UINT);
-BOOL ResizePalette(HPALETTE,UINT);
-BOOL RestoreDC(HDC,short);
-BOOL RoundRect(HDC,short,short,short,short,short,short);
-BOOL ScaleViewportExtEx(HDC,short,short,short,short,LPSIZE);
-BOOL ScaleWindowExtEx(HDC,short,short,short,short,LPSIZE);
-BOOL ScrollDC(HDC,short,short,LPRECT,LPRECT,HRGN,LPRECT);
-BOOL SetBitmapDimensionEx(HBITMAP,short,short,LPSIZE);
-BOOL SetConvertParams(int,int);
-BOOL SetDeskPattern(void);
-BOOL SetDeskWallPaper(LPSTR);
-BOOL SetErrorMode(WORD);
-BOOL SetMenu(HWND,HMENU);
-BOOL SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
-BOOL SetMessageQueue(int);
-BOOL SetProp(HWND,SEGPTR,HANDLE);
-BOOL SetViewportExtEx(HDC,short,short,LPSIZE);
-BOOL SetViewportOrgEx(HDC,short,short,LPPOINT);
-BOOL SetWinDebugInfo(LPWINDEBUGINFO);
-BOOL SetWindowExtEx(HDC,short,short,LPSIZE);
-BOOL SetWindowOrgEx(HDC,short,short,LPPOINT);
-BOOL SetWindowPlacement(HWND,LPWINDOWPLACEMENT);
-BOOL SetWindowPos(HWND,HWND,short,short,short,short,WORD);
-BOOL ShowWindow(HWND,int);
-BOOL StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
-BOOL SubtractRect(LPRECT,LPRECT,LPRECT);
-BOOL SwapMouseButton(BOOL);
-BOOL TextOut(HDC,short,short,LPSTR,short);
-BOOL TrackPopupMenu(HMENU,UINT,short,short,short,HWND,LPRECT);
-BOOL TranslateMDISysAccel(HWND,LPMSG);
-BOOL TranslateMessage(LPMSG);
-BOOL UnhookWindowsHook(short,FARPROC);
-BOOL UnhookWindowsHookEx(HHOOK);
-BOOL UnionRect(LPRECT,LPRECT,LPRECT);
-BOOL UnrealizeObject(HBRUSH);
-BOOL UnregisterClass(SEGPTR,HANDLE);
-BOOL WinHelp(HWND,LPSTR,WORD,DWORD);
-BOOL WritePrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR);
-BOOL WriteProfileString(LPSTR,LPSTR,LPSTR);
-BYTE GetTempDrive(BYTE);
-COLORREF GetBkColor(HDC);
-COLORREF GetSysColor(short);
-COLORREF GetTextColor(HDC);
-COLORREF SetPixel(HDC,short,short,COLORREF);
-DWORD CallNextHookEx(HHOOK,short,WPARAM,LPARAM);
-DWORD DefHookProc(short,WORD,DWORD,HHOOK*);
-DWORD GetAspectRatioFilter(HDC);
-DWORD GetBitmapDimension(HBITMAP);
-DWORD GetBrushOrg(HDC);
-DWORD GetCurrentPosition(HDC);
-/*DWORD GetCurrentTime(void);*/
-#define GetCurrentTime GetTickCount
-DWORD GetDCOrg(HDC);
-DWORD GetDialogBaseUnits(void);
-DWORD GetFreeSpace(WORD);
-DWORD GetHeapSpaces(HMODULE);
-DWORD GetMenuCheckMarkDimensions(void);
-DWORD GetMessagePos(void);
-DWORD GetNearestColor(HDC,DWORD);
-DWORD GetPixel(HDC,short,short);
-DWORD GetSelectorBase(WORD);
-DWORD GetSelectorLimit(WORD);
-DWORD GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT);
-DWORD GetTextExtent(HDC,LPSTR,short);
-DWORD GetTickCount(void);
-DWORD GetViewportExt(HDC);
-DWORD GetViewportOrg(HDC);
-DWORD GetWindowExt(HDC);
-DWORD GetWindowOrg(HDC);
-DWORD GlobalCompact(DWORD);
-DWORD GlobalDOSAlloc(DWORD);
-#ifdef WINELIB32
-HGLOBAL GlobalHandle(LPCVOID);
-#else
-DWORD GlobalHandle(UINT);
+INT        AccessResource(HINSTANCE,HRSRC);
+ATOM       AddAtom(SEGPTR);
+INT        AddFontResource(LPCSTR);
+void       AdjustWindowRect(LPRECT,DWORD,BOOL);
+void       AdjustWindowRectEx(LPRECT,DWORD,BOOL,DWORD);
+WORD       AllocCStoDSAlias(WORD);
+WORD       AllocDStoCSAlias(WORD);
+HGLOBAL    AllocResource(HINSTANCE,HRSRC,DWORD);
+WORD       AllocSelector(WORD);
+WORD       AllocSelectorArray(WORD);
+void       AnimatePalette(HPALETTE,UINT,UINT,LPPALETTEENTRY);
+LPSTR      AnsiLower(LPSTR);
+UINT       AnsiLowerBuff(LPSTR,UINT);
+SEGPTR     AnsiNext(SEGPTR);
+SEGPTR     AnsiPrev(SEGPTR,SEGPTR);
+INT        AnsiToOem(LPSTR,LPSTR);
+void       AnsiToOemBuff(LPSTR,LPSTR,INT);
+LPSTR      AnsiUpper(LPSTR);
+UINT       AnsiUpperBuff(LPSTR,UINT);
+BOOL       AnyPopup(void);
+BOOL       AppendMenu(HMENU,UINT,UINT,LPSTR);
+BOOL       Arc(HDC,int,int,int,int,int,int,int,int);
+WORD       ArrangeIconicWindows(HWND);
+HDWP       BeginDeferWindowPos(INT);
+HDC        BeginPaint(HWND,LPPAINTSTRUCT);
+BOOL       BitBlt(HDC,short,short,short,short,HDC,short,short,DWORD);
+BOOL       BringWindowToTop(HWND);
+int        BuildCommDCB(LPSTR,DCB*);
+BOOL       CallMsgFilter(SEGPTR,short);
+DWORD      CallNextHookEx(HHOOK,short,WPARAM,LPARAM);
+LONG       CallWindowProc(WNDPROC,HWND,UINT,WPARAM,LPARAM);
+int        Catch(LPCATCHBUF);
+BOOL       ChangeClipboardChain(HWND,HWND);
+BOOL       ChangeMenu(HMENU,UINT,LPSTR,UINT,UINT);
+WORD       ChangeSelector(WORD,WORD);
+void       CheckDlgButton(HWND,WORD,WORD);
+BOOL       CheckMenuItem(HMENU,UINT,UINT);
+void       CheckRadioButton(HWND,WORD,WORD,WORD);
+HWND       ChildWindowFromPoint(HWND,POINT);
+BOOL       Chord(HDC,int,int,int,int,int,int,int,int);
+int        ClearCommBreak(int);
+void       ClientToScreen(HWND,LPPOINT);
+void       ClipCursor(LPRECT);
+BOOL       CloseClipboard(void);
+int        CloseComm(int);
+HMETAFILE  CloseMetaFile(HANDLE);
+void       CloseSound(void);
+void       CloseWindow(HWND);
+int        CombineRgn(HRGN,HRGN,HRGN,short);
+int        ConvertRequest(HWND,LPKANJISTRUCT);
+HANDLE     CopyMetaFile(HANDLE,LPSTR);
+void       CopyRect(LPRECT,LPRECT);
+int        CountClipboardFormats(void);
+int        CountVoiceNotes(int);
+HBITMAP    CreateBitmap(short,short,BYTE,BYTE,LPSTR);
+HBITMAP    CreateBitmapIndirect(BITMAP*);
+HBRUSH     CreateBrushIndirect(LOGBRUSH*);
+void       CreateCaret(HWND,HBITMAP,short,short);
+HBITMAP    CreateCompatibleBitmap(HDC,short,short);
+HDC        CreateCompatibleDC(HDC);
+HCURSOR    CreateCursor(HANDLE,INT,INT,INT,INT,LPSTR,LPSTR);
+HANDLE     CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,LPSTR,LPSTR);
+HDC        CreateDC(LPSTR,LPSTR,LPSTR,LPSTR);
+HBRUSH     CreateDIBPatternBrush(HANDLE,WORD);
+HBITMAP    CreateDIBitmap(HDC,LPBITMAPINFOHEADER,DWORD,LPSTR,LPBITMAPINFO,WORD);
+HWND       CreateDialog(HANDLE,SEGPTR,HWND,WNDPROC);
+HWND       CreateDialogIndirect(HANDLE,SEGPTR,HWND,WNDPROC);
+HWND       CreateDialogIndirectParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
+HWND       CreateDialogParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
+HBITMAP    CreateDiscardableBitmap(HDC,short,short);
+HRGN       CreateEllipticRgn(short,short,short,short);
+HRGN       CreateEllipticRgnIndirect(LPRECT);
+HFONT      CreateFont(int,int,int,int,int,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPSTR);
+HFONT      CreateFontIndirect(LOGFONT*);
+HBRUSH     CreateHatchBrush(short,COLORREF);
+HDC        CreateIC(LPSTR,LPSTR,LPSTR,LPSTR);
+HICON      CreateIcon(HANDLE,INT,INT,BYTE,BYTE,LPSTR,LPSTR);
+HMENU      CreateMenu(void);
+HANDLE     CreateMetaFile(LPSTR);
+HPALETTE   CreatePalette(LPLOGPALETTE);
+HBRUSH     CreatePatternBrush(HBITMAP);
+HPEN       CreatePen(short,short,COLORREF);
+HPEN       CreatePenIndirect(LOGPEN*);
+HRGN       CreatePolyPolygonRgn(LPPOINT,LPINT,INT,INT);
+HRGN       CreatePolygonRgn(LPPOINT,INT,INT);
+HMENU      CreatePopupMenu(void);
+HRGN       CreateRectRgn(short,short,short,short);
+HRGN       CreateRectRgnIndirect(LPRECT);
+HRGN       CreateRoundRectRgn(short,short,short,short,short,short);
+HBRUSH     CreateSolidBrush(DWORD);
+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);
+LONG       DefDlgProc(HWND,UINT,WPARAM,LPARAM);
+LONG       DefFrameProc(HWND,HWND,UINT,WPARAM,LPARAM);
+DWORD      DefHookProc(short,WORD,DWORD,HHOOK*);
+LONG       DefMDIChildProc(HWND,UINT,WPARAM,LPARAM);
+LRESULT    DefWindowProc(HWND,UINT,WPARAM,LPARAM);
+HDWP       DeferWindowPos(HDWP,HWND,HWND,INT,INT,INT,INT,WORD);
+ATOM       DeleteAtom(ATOM);
+BOOL       DeleteDC(HDC);
+BOOL       DeleteMenu(HMENU,UINT,UINT);
+BOOL       DeleteMetaFile(HMETAFILE);
+BOOL       DeleteObject(HANDLE);
+void       DestroyCaret(void);
+BOOL       DestroyCursor(HCURSOR);
+BOOL       DestroyIcon(HICON);
+BOOL       DestroyMenu(HMENU);
+BOOL       DestroyWindow(HWND);
+int        DialogBox(HINSTANCE,SEGPTR,HWND,WNDPROC);
+int        DialogBoxIndirect(HANDLE,HANDLE,HWND,WNDPROC);
+int        DialogBoxIndirectParam(HANDLE,HANDLE,HWND,WNDPROC,LONG);
+int        DialogBoxParam(HANDLE,SEGPTR,HWND,WNDPROC,LONG);
+HANDLE     DirectResAlloc(HANDLE,WORD,WORD);
+void       DirectedYield(HTASK);
+LONG       DispatchMessage(LPMSG);
+int        DlgDirList(HWND,LPSTR,int,int,WORD);
+int        DlgDirListComboBox(HWND,SEGPTR,int,int,WORD);
+BOOL       DlgDirSelect(HWND,LPSTR,int);
+BOOL       DlgDirSelectComboBox(HWND,LPSTR,int);
+BOOL       DragDetect(HWND,POINT);
+DWORD      DragObject(HWND, HWND, WORD, WORD, WORD, HCURSOR);
+void       DrawFocusRect(HDC,LPRECT);
+BOOL       DrawIcon(HDC,short,short,HICON);
+void       DrawMenuBar(HWND);
+int        DrawText(HDC,LPSTR,int,LPRECT,WORD);
+DWORD      DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
+BOOL       Ellipse(HDC,int,int,int,int);
+BOOL       EmptyClipboard(void);
+BOOL       EnableHardwareInput(BOOL);
+BOOL       EnableMenuItem(HMENU,UINT,UINT);
+BOOL       EnableScrollBar(HWND,INT,UINT);
+BOOL       EnableWindow(HWND,BOOL);
+BOOL       EndDeferWindowPos(HDWP);
+void       EndDialog(HWND,short);
+void       EndPaint(HWND,LPPAINTSTRUCT);
+BOOL       EnumChildWindows(HWND,FARPROC,LONG);
+WORD       EnumClipboardFormats(WORD);
+int        EnumFonts(HDC,LPSTR,FARPROC,LPSTR);
+BOOL       EnumMetaFile(HDC,LOCALHANDLE,FARPROC,BYTE*);
+int        EnumObjects(HDC,int,FARPROC,LPSTR);
+int        EnumProps(HWND,FARPROC);
+BOOL       EnumTaskWindows(HANDLE,FARPROC,LONG);
+BOOL       EnumWindows(FARPROC,LONG);
+BOOL       EqualRect(LPRECT,LPRECT);
+BOOL       EqualRgn(HRGN,HRGN);
+int        Escape(HDC,int,int,LPSTR,LPSTR);
+LONG       EscapeCommFunction(int,int);
+int        ExcludeClipRect(HDC,short,short,short,short);
+int        ExcludeUpdateRgn(HDC,HWND);
+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);
+WORD       FarGetOwner(HANDLE);
+void       FarSetOwner(HANDLE,WORD);
+void       FatalExit(int);
+int        FillRect(HDC,LPRECT,HBRUSH);
+BOOL       FillRgn(HDC,HRGN,HBRUSH);
+void       FillWindow(HWND,HWND,HDC,HBRUSH);
+ATOM       FindAtom(SEGPTR);
+HANDLE     FindResource(HANDLE,SEGPTR,SEGPTR);
+HWND       FindWindow(SEGPTR,LPSTR);
+BOOL       FlashWindow(HWND,BOOL);
+BOOL       FloodFill(HDC,INT,INT,COLORREF);
+int        FlushComm(int,int);
+int        FrameRect(HDC,LPRECT,HBRUSH);
+BOOL       FrameRgn(HDC,HRGN,HBRUSH,int,int);
+void       FreeLibrary(HANDLE);
+BOOL       FreeModule(HANDLE);
+void       FreeProcInstance(FARPROC);
+BOOL       FreeResource(HANDLE);
+WORD       FreeSelector(WORD);
+UINT       GDIRealizePalette(HDC);
+HPALETTE   GDISelectPalette(HDC,HPALETTE);
+HWND       GetActiveWindow(void);
+DWORD      GetAspectRatioFilter(HDC);
+int        GetAsyncKeyState(int);
+HANDLE     GetAtomHandle(ATOM);
+WORD       GetAtomName(ATOM,LPSTR,short);
+LONG       GetBitmapBits(HBITMAP,LONG,LPSTR);
+DWORD      GetBitmapDimension(HBITMAP);
+BOOL       GetBitmapDimensionEx(HBITMAP,LPSIZE);
+COLORREF   GetBkColor(HDC);
+WORD       GetBkMode(HDC);
+DWORD      GetBrushOrg(HDC);
+BOOL       GetBrushOrgEx(HDC,LPPOINT);
+HWND       GetCapture(void);
+WORD       GetCaretBlinkTime(void);
+void       GetCaretPos(LPPOINT);
+BOOL       GetCharWidth(HDC,WORD,WORD,LPINT);
+BOOL       GetClassInfo(HANDLE,SEGPTR,LPWNDCLASS);
+LONG       GetClassLong(HWND,short);
+int        GetClassName(HWND,LPSTR,short);
+WORD       GetClassWord(HWND,short);
+void       GetClientRect(HWND,LPRECT);
+int        GetClipBox(HDC,LPRECT);
+HRGN       GetClipRgn(HDC);
+HANDLE     GetClipboardData(WORD);
+int        GetClipboardFormatName(WORD,LPSTR,short);
+HWND       GetClipboardOwner(void);
+HWND       GetClipboardViewer(void);
+HANDLE     GetCodeHandle(FARPROC);
+void       GetCodeInfo(FARPROC,LPVOID);
+int        GetCommError(int,COMSTAT*);
+UINT       GetCommEventMask(int,int);
+int        GetCommState(int,DCB*);
+HBRUSH     GetControlBrush(HWND,HDC,WORD);
+HANDLE     GetCurrentPDB(void);
+DWORD      GetCurrentPosition(HDC);
+BOOL       GetCurrentPositionEx(HDC,LPPOINT);
+HANDLE     GetCurrentTask(void);
+DWORD      GetCurrentTime(void);
+HCURSOR    GetCursor(void);
+void       GetCursorPos(LPPOINT);
+HDC        GetDC(HWND);
+HDC        GetDCEx(HWND,HRGN,DWORD);
+DWORD      GetDCOrg(HDC);
+HDC        GetDCState(HDC);
+int        GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+SEGPTR     GetDOSEnvironment(void);
+HWND       GetDesktopHwnd(void);
+HWND       GetDesktopWindow(void);
+int        GetDeviceCaps(HDC,WORD);
+DWORD      GetDialogBaseUnits(void);
+int        GetDlgCtrlID(HWND);
+HWND       GetDlgItem(HWND,WORD);
+WORD       GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
+int        GetDlgItemText(HWND,WORD,SEGPTR,WORD);
+WORD       GetDoubleClickTime(void);
+WORD       GetDriveType(INT);
+int        GetEnvironment(LPSTR,LPSTR,WORD);
+HMODULE    GetExePtr(HANDLE);
+HWND       GetFocus(void);
+DWORD      GetFreeSpace(WORD);
+DWORD      GetHeapSpaces(HMODULE);
+BOOL       GetInputState(void);
+int        GetInstanceData(HANDLE,WORD,int);
+WORD       GetInternalWindowPos(HWND,LPRECT,LPPOINT);
+int        GetKBCodePage(void);
+int        GetKeyNameText(LONG,LPSTR,int);
+int        GetKeyState(int);
+void       GetKeyboardState(BYTE*);
+int        GetKeyboardType(int);
+HWND       GetLastActivePopup(HWND);
+WORD       GetMapMode(HDC);
+HMENU      GetMenu(HWND);
+DWORD      GetMenuCheckMarkDimensions(void);
+WORD       GetMenuItemCount(HMENU);
+UINT       GetMenuItemID(HMENU,int);
+UINT       GetMenuState(HMENU,UINT,UINT);
+int        GetMenuString(HMENU,UINT,LPSTR,short,UINT);
+BOOL       GetMessage(SEGPTR,HWND,UINT,UINT);
+LONG       GetMessageExtraInfo(void);
+DWORD      GetMessagePos(void);
+LONG       GetMessageTime(void);
+HANDLE     GetMetaFile(LPSTR);
+HANDLE     GetMetaFileBits(HANDLE);
+int        GetModuleFileName(HANDLE,LPSTR,short);
+HANDLE     GetModuleHandle(LPCSTR);
+int        GetModuleUsage(HANDLE);
+FARPROC    GetMouseEventProc(void);
+DWORD      GetNearestColor(HDC,DWORD);
+WORD       GetNearestPaletteIndex(HPALETTE,DWORD);
+HWND       GetNextDlgGroupItem(HWND,HWND,BOOL);
+HWND       GetNextDlgTabItem(HWND,HWND,BOOL);
+HWND       GetNextWindow(HWND,WORD);
+WORD       GetNumTasks(void);
+int        GetObject(HANDLE,int,LPSTR);
+HWND       GetOpenClipboardWindow(void);
+WORD       GetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
+HWND       GetParent(HWND);
+DWORD      GetPixel(HDC,short,short);
+WORD       GetPolyFillMode(HDC);
+int        GetPriorityClipboardFormat(WORD*,short);
+WORD       GetPrivateProfileInt(LPSTR,LPSTR,short,LPSTR);
+short      GetPrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR,short,LPSTR);
+FARPROC    GetProcAddress(HANDLE,SEGPTR);
+WORD       GetProfileInt(LPSTR,LPSTR,int);
+int        GetProfileString(LPSTR,LPSTR,LPSTR,LPSTR,int);
+HANDLE     GetProp(HWND,SEGPTR);
+WORD       GetROP2(HDC);
+WORD       GetRelAbs(HDC);
+int        GetRgnBox(HRGN,LPRECT);
+int        GetScrollPos(HWND,int);
+void       GetScrollRange(HWND,int,LPINT,LPINT);
+DWORD      GetSelectorBase(WORD);
+DWORD      GetSelectorLimit(WORD);
+HANDLE     GetStockObject(int);
+WORD       GetStretchBltMode(HDC);
+HMENU      GetSubMenu(HMENU,short);
+COLORREF   GetSysColor(short);
+HWND       GetSysModalWindow(void);
+UINT       GetSystemDirectory(LPSTR,UINT);
+HMENU      GetSystemMenu(HWND,BOOL);
+int        GetSystemMetrics(WORD);
+WORD       GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
+WORD       GetSystemPaletteUse(HDC);
+DWORD      GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT);
+HINSTANCE  GetTaskDS(void);
+HGLOBAL    GetTaskQueue(HTASK);
+BYTE       GetTempDrive(BYTE);
+INT        GetTempFileName(BYTE,LPCSTR,UINT,LPSTR);
+WORD       GetTextAlign(HDC);
+short      GetTextCharacterExtra(HDC);
+COLORREF   GetTextColor(HDC);
+DWORD      GetTextExtent(HDC,LPSTR,short);
+BOOL       GetTextExtentPoint(HDC,LPSTR,short,LPSIZE);
+INT        GetTextFace(HDC,INT,LPSTR);
+BOOL       GetTextMetrics(HDC,LPTEXTMETRIC);
+LPINT      GetThresholdEvent(void);
+int        GetThresholdStatus(void);
+DWORD      GetTickCount(void);
+HWND       GetTopWindow(HWND);
+BOOL       GetUpdateRect(HWND,LPRECT,BOOL);
+int        GetUpdateRgn(HWND,HRGN,BOOL);
+LONG       GetVersion(void);
+DWORD      GetViewportExt(HDC);
+BOOL       GetViewportExtEx(HDC,LPPOINT);
+DWORD      GetViewportOrg(HDC);
+BOOL       GetViewportOrgEx(HDC,LPPOINT);
+BOOL       GetWinDebugInfo(LPWINDEBUGINFO,UINT);
+LONG       GetWinFlags(void);
+HWND       GetWindow(HWND,WORD);
+HDC        GetWindowDC(HWND);
+DWORD      GetWindowExt(HDC);
+BOOL       GetWindowExtEx(HDC,LPPOINT);
+LONG       GetWindowLong(HWND,short);
+DWORD      GetWindowOrg(HDC);
+BOOL       GetWindowOrgEx(HDC,LPPOINT);
+BOOL       GetWindowPlacement(HWND,LPWINDOWPLACEMENT);
+void       GetWindowRect(HWND,LPRECT);
+HANDLE     GetWindowTask(HWND);
+int        GetWindowText(HWND,LPSTR,int);
+int        GetWindowTextLength(HWND);
+WORD       GetWindowWord(HWND,short);
+UINT       GetWindowsDirectory(LPSTR,UINT);
+ATOM       GlobalAddAtom(SEGPTR);
+HGLOBAL    GlobalAlloc(WORD,DWORD);
+#ifndef WINELIB32 /* Obsolete in Win32 */
+DWORD      GlobalCompact(DWORD);
 #endif
-DWORD GlobalSize(HGLOBAL);
-DWORD MoveTo(HDC,short,short);
-DWORD OemKeyScan(WORD);
-DWORD OffsetViewportOrg(HDC,short,short);
-DWORD OffsetWindowOrg(HDC,short,short);
-DWORD ScaleViewportExt(HDC,short,short,short,short);
-DWORD ScaleWindowExt(HDC,short,short,short,short);
-DWORD SetBitmapDimension(HBITMAP,short,short);
-DWORD SetBkColor(HDC,COLORREF);
-DWORD SetBrushOrg(HDC,short,short);
-DWORD SetMapperFlags(HDC,DWORD);
-DWORD SetTextColor(HDC,DWORD);
-DWORD SetViewportExt(HDC,short,short);
-DWORD SetViewportOrg(HDC,short,short);
-DWORD SetWindowExt(HDC,short,short);
-DWORD SetWindowOrg(HDC,short,short);
-DWORD SizeofResource(HANDLE,HRSRC);
-FARPROC GetMouseEventProc(void);
-FARPROC GetProcAddress(HANDLE,SEGPTR);
-FARPROC LocalNotify(FARPROC);
-FARPROC MakeProcInstance(FARPROC,HANDLE);
-FARPROC SetResourceHandler(HANDLE,LPSTR,FARPROC);
-FARPROC SetWindowsHook(short,FARPROC);
-HANDLE CopyMetaFile(HANDLE,LPSTR);
-HANDLE CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,LPSTR,LPSTR);
-HANDLE CreateMetaFile(LPSTR);
-HANDLE DirectResAlloc(HANDLE,WORD,WORD);
-HANDLE FindResource(HANDLE,SEGPTR,SEGPTR);
-HANDLE GetAtomHandle(ATOM);
-HANDLE GetClipboardData(WORD);
-HANDLE GetCodeHandle(FARPROC);
-HANDLE GetCurrentPDB(void);
-HANDLE GetCurrentTask(void);
-HANDLE GetMetaFile(LPSTR);
-HANDLE GetMetaFileBits(HANDLE);
-HANDLE GetModuleHandle(LPCSTR);
-HANDLE GetProp(HWND,SEGPTR);
-HANDLE GetStockObject(int);
-HANDLE GetWindowTask(HWND);
-HANDLE LoadAccelerators(HANDLE,SEGPTR);
-HANDLE LoadLibrary(LPCSTR);
-HANDLE LoadModule(LPCSTR,LPVOID);
-HANDLE LoadResource(HANDLE,HANDLE);
-HANDLE LocalAlloc(WORD,WORD);
-HANDLE LocalFree(HANDLE);
-HANDLE LocalHandle(WORD);
-HANDLE LocalReAlloc(HANDLE,WORD,WORD);
-HANDLE RemoveProp(HWND,SEGPTR);
-HANDLE SelectObject(HDC,HANDLE);
-HANDLE SetClipboardData(WORD,HANDLE);
-HANDLE SetMetaFileBits(HANDLE);
-HANDLE WinExec(LPSTR,WORD);
-HBITMAP CreateBitmap(short,short,BYTE,BYTE,LPSTR);
-HBITMAP CreateBitmapIndirect(BITMAP*);
-HBITMAP CreateCompatibleBitmap(HDC,short,short);
-HBITMAP CreateDIBitmap(HDC,LPBITMAPINFOHEADER,DWORD,LPSTR,LPBITMAPINFO,WORD);
-HBITMAP CreateDiscardableBitmap(HDC,short,short);
-HBITMAP LoadBitmap(HANDLE,SEGPTR);
-HBRUSH CreateBrushIndirect(LOGBRUSH*);
-HBRUSH CreateDIBPatternBrush(HANDLE,WORD);
-HBRUSH CreateHatchBrush(short,COLORREF);
-HBRUSH CreatePatternBrush(HBITMAP);
-HBRUSH CreateSolidBrush(DWORD);
-HBRUSH GetControlBrush(HWND,HDC,WORD);
-HCURSOR CreateCursor(HANDLE,INT,INT,INT,INT,LPSTR,LPSTR);
-HCURSOR GetCursor(void);
-HCURSOR LoadCursor(HANDLE,SEGPTR);
-HCURSOR SetCursor(HCURSOR);
-HDC BeginPaint(HWND,LPPAINTSTRUCT);
-HDC CreateCompatibleDC(HDC);
-HDC CreateDC(LPSTR,LPSTR,LPSTR,LPSTR);
-HDC CreateIC(LPSTR,LPSTR,LPSTR,LPSTR);
-HDC GetDC(HWND);
-HDC GetDCEx(HWND,HRGN,DWORD);
-HDC GetDCState(HDC);
-HDC GetWindowDC(HWND);
-HDWP BeginDeferWindowPos(INT);
-HDWP DeferWindowPos(HDWP,HWND,HWND,INT,INT,INT,INT,WORD);
-HFONT CreateFont(int,int,int,int,int,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPSTR);
-HFONT CreateFontIndirect(LOGFONT*);
-HGLOBAL AllocResource(HINSTANCE,HRSRC,DWORD);
-HGLOBAL GetTaskQueue(HTASK);
-HGLOBAL GlobalAlloc(WORD,DWORD);
-HGLOBAL GlobalFree(HGLOBAL);
-HGLOBAL GlobalLRUNewest(HGLOBAL);
-HGLOBAL GlobalLRUOldest(HGLOBAL);
-HGLOBAL GlobalReAlloc(HGLOBAL,DWORD,WORD);
-HGLOBAL LockSegment(HGLOBAL);
-HGLOBAL SetTaskQueue(HTASK,HGLOBAL);
-HHOOK SetWindowsHookEx(short,HOOKPROC,HINSTANCE,HTASK);
-HICON CreateIcon(HANDLE,INT,INT,BYTE,BYTE,LPSTR,LPSTR);
-HICON LoadIcon(HANDLE,SEGPTR);
-HINSTANCE GetTaskDS(void);
-HMENU CreateMenu(void);
-HMENU CreatePopupMenu(void);
-HMENU GetMenu(HWND);
-HMENU GetSubMenu(HMENU,short);
-HMENU GetSystemMenu(HWND,BOOL);
-HMENU LoadMenu(HANDLE,SEGPTR);
-HMENU LoadMenuIndirect(LPSTR);
-HMENU LookupMenuHandle(HMENU,INT);
-HMETAFILE CloseMetaFile(HANDLE);
-HMODULE GetExePtr(HANDLE);
-HPALETTE CreatePalette(LPLOGPALETTE);
-HPALETTE GDISelectPalette(HDC,HPALETTE);
-HPALETTE SelectPalette(HDC,HPALETTE,BOOL);
-HPEN CreatePen(short,short,COLORREF);
-HPEN CreatePenIndirect(LOGPEN*);
-HRGN CreateEllipticRgn(short,short,short,short);
-HRGN CreateEllipticRgnIndirect(LPRECT);
-HRGN CreatePolyPolygonRgn(LPPOINT,LPINT,INT,INT);
-HRGN CreatePolygonRgn(LPPOINT,INT,INT);
-HRGN CreateRectRgn(short,short,short,short);
-HRGN CreateRectRgnIndirect(LPRECT);
-HRGN CreateRoundRectRgn(short,short,short,short,short,short);
-HRGN GetClipRgn(HDC);
-HRGN InquireVisRgn(HDC);
-HRGN SaveVisRgn(HDC);
-HWND ChildWindowFromPoint(HWND,POINT);
-HWND CreateDialog(HANDLE,SEGPTR,HWND,WNDPROC);
-HWND CreateDialogIndirect(HANDLE,SEGPTR,HWND,WNDPROC);
-HWND CreateDialogIndirectParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
-HWND CreateDialogParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
-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);
-HWND FindWindow(SEGPTR,LPSTR);
-HWND GetActiveWindow(void);
-HWND GetCapture(void);
-HWND GetClipboardOwner(void);
-HWND GetClipboardViewer(void);
-HWND GetDesktopHwnd(void);
-HWND GetDesktopWindow(void);
-HWND GetDlgItem(HWND,WORD);
-HWND GetFocus(void);
-HWND GetLastActivePopup(HWND);
-HWND GetNextDlgGroupItem(HWND,HWND,BOOL);
-HWND GetNextDlgTabItem(HWND,HWND,BOOL);
-HWND GetNextWindow(HWND,WORD);
-HWND GetOpenClipboardWindow(void);
-HWND GetParent(HWND);
-HWND GetSysModalWindow(void);
-HWND GetTopWindow(HWND);
-HWND GetWindow(HWND,WORD);
-HWND SetActiveWindow(HWND);
-HWND SetCapture(HWND);
-HWND SetClipboardViewer(HWND);
-HWND SetFocus(HWND);
-HWND SetParent(HWND,HWND);
-HWND SetSysModalWindow(HWND);
-HWND WindowFromPoint(POINT);
-INT AccessResource(HINSTANCE,HRSRC);
-INT AddFontResource(LPCSTR);
-INT AnsiToOem(LPSTR,LPSTR);
-INT GetTempFileName(BYTE,LPCSTR,UINT,LPSTR);
-INT GetTextFace(HDC,INT,LPSTR);
-INT OpenFile(LPCSTR,LPOFSTRUCT,UINT);
-INT _lclose(INT);
-INT _lcreat(LPSTR,INT);
-INT _lopen(LPSTR,INT);
-INT _lread(INT,LPSTR,WORD);
-INT _lwrite(INT,LPCSTR,WORD);
-INT lstrcmp(LPCSTR,LPCSTR);
-INT lstrcmpi(LPCSTR,LPCSTR);
-INT lstrlen(LPCSTR);
-LONG CallWindowProc(WNDPROC,HWND,UINT,WPARAM,LPARAM);
-LONG DefDlgProc(HWND,UINT,WPARAM,LPARAM);
-LONG DefFrameProc(HWND,HWND,UINT,WPARAM,LPARAM);
-LONG DefMDIChildProc(HWND,UINT,WPARAM,LPARAM);
-LONG DispatchMessage(LPMSG);
-LONG EscapeCommFunction(int,int);
-LONG GetBitmapBits(HBITMAP,LONG,LPSTR);
-LONG GetClassLong(HWND,short);
-LONG GetMessageExtraInfo(void);
-LONG GetMessageTime(void);
-LONG GetVersion(void);
-LONG GetWinFlags(void);
-LONG GetWindowLong(HWND,short);
-LONG SendDlgItemMessage(HWND,INT,UINT,WPARAM,LPARAM);
-LONG SetBitmapBits(HBITMAP,LONG,LPSTR);
-LONG SetClassLong(HWND,short,LONG);
-LONG SetSwapAreaSize(WORD);
-LONG SetWindowLong(HWND,short,LONG);
-LONG TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT,short);
-LONG _hread(INT,LPSTR,LONG);
-LONG _hwrite(INT,LPCSTR,LONG);
-LONG _llseek(INT,LONG,INT);
-LPINT GetThresholdEvent(void);
-LPSTR AnsiLower(LPSTR);
-LPSTR AnsiUpper(LPSTR);
-LPSTR LockResource(HANDLE);
-LPSTR ValidateFreeSpaces(void);
-LPVOID GlobalLock(HGLOBAL);
-LRESULT DefWindowProc(HWND,UINT,WPARAM,LPARAM);
-LRESULT SendMessage(HWND,UINT,WPARAM,LPARAM);
-NPVOID LocalLock(HLOCAL);
-SEGPTR AnsiNext(SEGPTR);
-SEGPTR AnsiPrev(SEGPTR,SEGPTR);
-SEGPTR GetDOSEnvironment(void);
-SEGPTR GlobalWire(HGLOBAL);
-SEGPTR WIN16_GlobalLock(HGLOBAL);
-SEGPTR WIN16_LockResource(HANDLE);
-SEGPTR lstrcat(SEGPTR,SEGPTR);
-SEGPTR lstrcpy(SEGPTR,SEGPTR);
-SEGPTR lstrcpyn(SEGPTR,SEGPTR,WORD);
-UINT AnsiLowerBuff(LPSTR,UINT);
-UINT AnsiUpperBuff(LPSTR,UINT);
-UINT GDIRealizePalette(HDC);
-UINT RealizePalette(HDC);
-WORD AllocCStoDSAlias(WORD);
-WORD AllocDStoCSAlias(WORD);
-WORD AllocSelector(WORD);
-WORD AllocSelectorArray(WORD);
-WORD ArrangeIconicWindows(HWND);
-WORD ChangeSelector(WORD,WORD);
-WORD EnumClipboardFormats(WORD);
-WORD FarGetOwner(HANDLE);
-WORD FreeSelector(WORD);
-WORD GetAtomName(ATOM,LPSTR,short);
-WORD GetBkMode(HDC);
-WORD GetCaretBlinkTime(void);
-WORD GetClassWord(HWND,short);
-UINT GetCommEventMask(int,int);
-WORD GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
-WORD GetDoubleClickTime(void);
-WORD GetDriveType(INT);
-WORD GetInternalWindowPos(HWND,LPRECT,LPPOINT);
-WORD GetMapMode(HDC);
-WORD GetMenuItemCount(HMENU);
-UINT GetMenuItemID(HMENU,int);
-UINT GetMenuState(HMENU,UINT,UINT);
-WORD GetNearestPaletteIndex(HPALETTE,DWORD);
-WORD GetNumTasks(void);
-WORD GetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
-WORD GetPolyFillMode(HDC);
-WORD GetPrivateProfileInt(LPSTR,LPSTR,short,LPSTR);
-WORD GetProfileInt(LPSTR,LPSTR,int);
-WORD GetROP2(HDC);
-WORD GetRelAbs(HDC);
-WORD GetStretchBltMode(HDC);
-UINT GetSystemDirectory(LPSTR,UINT);
-WORD GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
-WORD GetSystemPaletteUse(HDC);
-WORD GetTextAlign(HDC);
-WORD GetWindowWord(HWND,short);
-UINT GetWindowsDirectory(LPSTR,UINT);
-WORD GlobalDOSFree(WORD);
-WORD GlobalFlags(HGLOBAL);
-WORD GlobalGetAtomName(ATOM,LPSTR,short);
-WORD GlobalPageLock(HGLOBAL);
-WORD GlobalPageUnlock(HGLOBAL);
-WORD InitAtomTable(WORD);
-WORD IsDlgButtonChecked(HWND,WORD);
-WORD LocalCompact(WORD);
-WORD LocalFlags(HLOCAL);
-WORD LocalShrink(HANDLE,WORD);
-WORD LocalSize(HLOCAL);
-WORD MapVirtualKey(WORD,WORD);
-WORD PrestoChangoSelector(WORD,WORD);
-WORD RealizeDefaultPalette(HDC);
-WORD RegisterClipboardFormat(LPCSTR);
-WORD RegisterWindowMessage(SEGPTR);
-WORD SelectorAccessRights(WORD,WORD,WORD);
-WORD SetBkMode(HDC,WORD);
-WORD SetClassWord(HWND,short,WORD);
-WORD SetHandleCount(WORD);
-WORD SetMapMode(HDC,WORD);
-WORD SetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
-WORD SetPolyFillMode(HDC,WORD);
-WORD SetROP2(HDC,WORD);
-WORD SetRelAbs(HDC,WORD);
-WORD SetSelectorBase(WORD,DWORD);
-WORD SetSelectorLimit(WORD,DWORD);
-WORD SetStretchBltMode(HDC,WORD);
-WORD SetSystemPaletteUse(HDC,WORD);
-WORD SetSystemTimer(HWND,WORD,WORD,FARPROC);
-WORD SetTextAlign(HDC,WORD);
-WORD SetTimer(HWND,WORD,WORD,FARPROC);
-WORD SetWindowWord(HWND,short,WORD);
-WORD VkKeyScan(WORD);
-UINT* SetCommEventMask(int,UINT);
-int BuildCommDCB(LPSTR,DCB*);
-int Catch(LPCATCHBUF);
-int ClearCommBreak(int);
-int CloseComm(int);
-int CombineRgn(HRGN,HRGN,HRGN,short);
-int ConvertRequest(HWND,LPKANJISTRUCT);
-int CountClipboardFormats(void);
-int CountVoiceNotes(int);
-int DialogBox(HINSTANCE,SEGPTR,HWND,WNDPROC);
-int DialogBoxIndirect(HANDLE,HANDLE,HWND,WNDPROC);
-int DialogBoxIndirectParam(HANDLE,HANDLE,HWND,WNDPROC,LONG);
-int DialogBoxParam(HANDLE,SEGPTR,HWND,WNDPROC,LONG);
-int DlgDirList(HWND,LPSTR,int,int,WORD);
-int DlgDirListComboBox(HWND,SEGPTR,int,int,WORD);
-int DrawText(HDC,LPSTR,int,LPRECT,WORD);
-int EnumFonts(HDC,LPSTR,FARPROC,LPSTR);
-int EnumObjects(HDC,int,FARPROC,LPSTR);
-int EnumProps(HWND,FARPROC);
-int Escape(HDC,int,int,LPSTR,LPSTR);
-int ExcludeClipRect(HDC,short,short,short,short);
-int ExcludeUpdateRgn(HDC,HWND);
-int ExcludeVisRect(HDC,short,short,short,short);
-int FillRect(HDC,LPRECT,HBRUSH);
-int FlushComm(int,int);
-int FrameRect(HDC,LPRECT,HBRUSH);
-int GetAsyncKeyState(int);
-int GetClassName(HWND,LPSTR,short);
-int GetClipBox(HDC,LPRECT);
-int GetClipboardFormatName(WORD,LPSTR,short);
-int GetCommError(int,COMSTAT*);
-int GetCommState(int,DCB*);
-int GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-int GetDeviceCaps(HDC,WORD);
-int GetDlgCtrlID(HWND);
-int GetDlgItemText(HWND,WORD,SEGPTR,WORD);
-int GetEnvironment(LPSTR,LPSTR,WORD);
-int GetInstanceData(HANDLE,WORD,int);
-int GetKBCodePage(void);
-int GetKeyNameText(LONG,LPSTR,int);
-int GetKeyState(int);
-int GetKeyboardType(int);
-int GetMenuString(HMENU,UINT,LPSTR,short,UINT);
-int GetModuleFileName(HANDLE,LPSTR,short);
-int GetModuleUsage(HANDLE);
-int GetObject(HANDLE,int,LPSTR);
-int GetPriorityClipboardFormat(WORD*,short);
-int GetProfileString(LPSTR,LPSTR,LPSTR,LPSTR,int);
-int GetRgnBox(HRGN,LPRECT);
-int GetScrollPos(HWND,int);
-int GetSystemMetrics(WORD);
-int GetThresholdStatus(void);
-int GetUpdateRgn(HWND,HRGN,BOOL);
-int GetWindowText(HWND,LPSTR,int);
-int GetWindowTextLength(HWND);
-int IntersectClipRect(HDC,short,short,short,short);
-int IntersectVisRect(HDC,short,short,short,short);
-int LoadString(HANDLE,WORD,LPSTR,int);
-int MessageBox(HWND,LPSTR,LPSTR,WORD);
-int MulDiv(int,int,int);
-int OffsetClipRgn(HDC,short,short);
-int OffsetRgn(HRGN,short,short);
-int OpenComm(LPSTR,UINT,UINT);
-int OpenSound(void);
-int ProfInsChk(void);
-int ReadComm(int,LPSTR,int);
-int ReleaseDC(HWND,HDC);
-int RestoreVisRgn(HDC);
-int SaveDC(HDC);
-int ScrollWindowEx(HWND,short,short,LPRECT,LPRECT,HRGN,LPRECT,WORD);
-int SelectClipRgn(HDC,HRGN);
-int SelectVisRgn(HDC,HRGN);
-int SetCommBreak(int);
-int SetCommState(DCB*);
-int SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-int SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-int SetEnvironment(LPSTR,LPSTR,WORD);
-int SetScrollPos(HWND,int,int,BOOL);
-int SetSoundNoise(int,int);
-int SetVoiceAccent(int,int,int,int,int);
-int SetVoiceEnvelope(int,int,int);
-int SetVoiceNote(int,int,int,int);
-int SetVoiceQueueSize(int,int);
-int SetVoiceSound(int,LONG,int);
-int SetVoiceThreshold(int,int);
-int ShowCursor(BOOL);
-int StartSound(void);
-int StopSound(void);
-int StretchDIBits(HDC,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
-int SyncAllVoices(void);
-int Throw(LPCATCHBUF,int);
-int ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
-int TranslateAccelerator(HWND,HANDLE,LPMSG);
-int TransmitCommChar(int,char);
-int UngetCommChar(int,char);
-int UpdateColors(HDC);
-int WaitSoundState(int);
-int WriteComm(int,LPSTR,int);
-int wvsprintf(LPSTR,LPSTR,LPSTR);
-short GetPrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR,short,LPSTR);
-short GetTextCharacterExtra(HDC);
-short SetTextCharacterExtra(HDC,short);
-short SetTextJustification(HDC,short,short);
-void AdjustWindowRect(LPRECT,DWORD,BOOL);
-void AdjustWindowRectEx(LPRECT,DWORD,BOOL,DWORD);
-void AnimatePalette(HPALETTE,UINT,UINT,LPPALETTEENTRY);
-void AnsiToOemBuff(LPSTR,LPSTR,INT);
-void CheckDlgButton(HWND,WORD,WORD);
-void CheckRadioButton(HWND,WORD,WORD,WORD);
-void ClientToScreen(HWND,LPPOINT);
-void ClipCursor(LPRECT);
-void CloseSound(void);
-void CloseWindow(HWND);
-void CopyRect(LPRECT,LPRECT);
-void CreateCaret(HWND,HBITMAP,short,short);
-void DebugBreak(void);
-void DestroyCaret(void);
-void DirectedYield(HTASK);
-void DrawFocusRect(HDC,LPRECT);
-void DrawMenuBar(HWND);
-void EndDialog(HWND,short);
-void EndPaint(HWND,LPPAINTSTRUCT);
-void FarSetOwner(HANDLE,WORD);
-void FatalExit(int);
-void FillWindow(HWND,HWND,HDC,HBRUSH);
-void FreeLibrary(HANDLE);
-void FreeProcInstance(FARPROC);
-void GetCaretPos(LPPOINT);
-void GetClientRect(HWND,LPRECT);
-void GetCodeInfo(FARPROC,LPVOID);
-void GetCursorPos(LPPOINT);
-void GetKeyboardState(BYTE*);
-void GetScrollRange(HWND,int,LPINT,LPINT);
-void GetWindowRect(HWND,LPRECT);
-void GlobalFix(HGLOBAL);
-void GlobalFreeAll(HANDLE);
-void GlobalNotify(FARPROC);
-void GlobalUnfix(HGLOBAL);
-void HideCaret(HWND);
-void InflateRect(LPRECT,short,short);
-void InvalidateRect(HWND,LPRECT,BOOL);
-void InvalidateRgn(HWND,HRGN,BOOL);
-void InvertRect(HDC,LPRECT);
-void LimitEmsPages(DWORD);
-void LineDDA(short,short,short,short,FARPROC,long);
-void MapDialogRect(HWND,LPRECT);
-void MapWindowPoints(HWND,HWND,LPPOINT,WORD);
-void MessageBeep(WORD);
-void OemToAnsiBuff(LPSTR,LPSTR,INT);
-void OffsetRect(LPRECT,short,short);
-void OutputDebugString(LPSTR);
-void PaintRect(HWND,HWND,HDC,HBRUSH,LPRECT);
-void PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,WORD);
-void PostQuitMessage(int);
-void ProfClear(void);
-void ProfFinish(void);
-void ProfFlush(void);
-void ProfSampRate(int,int);
-void ProfSetup(int,int);
-void ProfStart(void);
-void ProfStop(void);
-void ReleaseCapture(void);
-void ReplyMessage(LONG);
-void ScreenToClient(HWND,LPPOINT);
-void ScrollWindow(HWND,short,short,LPRECT,LPRECT);
-void SetCaretBlinkTime(WORD);
-void SetCaretPos(short,short);
-void SetConvertHook(BOOL);
-void SetCursorPos(short,short);
-void SetDCState(HDC,HDC);
-void SetDlgItemInt(HWND,WORD,WORD,BOOL);
-void SetDlgItemText(HWND,WORD,SEGPTR);
-void SetDoubleClickTime(WORD);
-void SetInternalWindowPos(HWND,WORD,LPRECT,LPPOINT);
-void SetKeyboardState(BYTE*);
-void SetRect(LPRECT,short,short,short,short);
-void SetRectEmpty(LPRECT);
-void SetRectRgn(HRGN,short,short,short,short);
-void SetScrollRange(HWND,int,int,int,BOOL);
-void SetSysColors(int,LPINT,COLORREF*);
-void SetWindowText(HWND,LPSTR);
-void ShowCaret(HWND);
-void ShowOwnedPopups(HWND,BOOL);
-void ShowScrollBar(HWND,WORD,BOOL);
-void SwapRecording(WORD);
-void SwitchStackBack(void);
-void SwitchStackTo(WORD,WORD,WORD);
-void UnlockSegment(HGLOBAL);
-void UpdateWindow(HWND);
-void ValidateCodeSegments(void);
-void ValidateRect(HWND,LPRECT);
-void ValidateRgn(HWND,HRGN);
-void WaitMessage(void);
-void Yield(void);
+DWORD      GlobalDOSAlloc(DWORD);
+WORD       GlobalDOSFree(WORD);
+ATOM       GlobalDeleteAtom(ATOM);
+ATOM       GlobalFindAtom(SEGPTR);
+void       GlobalFix(HGLOBAL);
+WORD       GlobalFlags(HGLOBAL);
+HGLOBAL    GlobalFree(HGLOBAL);
+void       GlobalFreeAll(HANDLE);
+WORD       GlobalGetAtomName(ATOM,LPSTR,short);
+#ifdef WINELIB32
+HGLOBAL    GlobalHandle(LPCVOID);
+#else
+DWORD      GlobalHandle(UINT);
+#endif
+HGLOBAL    GlobalLRUNewest(HGLOBAL);
+HGLOBAL    GlobalLRUOldest(HGLOBAL);
+LPVOID     GlobalLock(HGLOBAL);
+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);
+BOOL       GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
+void       HideCaret(HWND);
+BOOL       HiliteMenuItem(HWND,HMENU,UINT,UINT);
+BOOL       InSendMessage(void);
+void       InflateRect(LPRECT,short,short);
+WORD       InitAtomTable(WORD);
+HRGN       InquireVisRgn(HDC);
+BOOL       InsertMenu(HMENU,UINT,UINT,UINT,LPSTR);
+int        IntersectClipRect(HDC,short,short,short,short);
+BOOL       IntersectRect(LPRECT,LPRECT,LPRECT);
+int        IntersectVisRect(HDC,short,short,short,short);
+void       InvalidateRect(HWND,LPRECT,BOOL);
+void       InvalidateRgn(HWND,HRGN,BOOL);
+void       InvertRect(HDC,LPRECT);
+BOOL       InvertRgn(HDC,HRGN);
+BOOL       IsBadCodePtr(SEGPTR);
+BOOL       IsBadHugeReadPtr(SEGPTR,DWORD);
+BOOL       IsBadHugeWritePtr(SEGPTR,DWORD);
+BOOL       IsBadReadPtr(SEGPTR,WORD);
+BOOL       IsBadStringPtr(SEGPTR,WORD);
+BOOL       IsBadWritePtr(SEGPTR,WORD);
+BOOL       IsCharAlpha(char);
+BOOL       IsCharAlphaNumeric(char);
+BOOL       IsCharLower(char);
+BOOL       IsCharUpper(char);
+BOOL       IsChild(HWND,HWND);
+BOOL       IsClipboardFormatAvailable(WORD);
+BOOL       IsDialogMessage(HWND,LPMSG);
+WORD       IsDlgButtonChecked(HWND,WORD);
+BOOL       IsIconic(HWND);
+BOOL       IsRectEmpty(LPRECT);
+BOOL       IsTwoByteCharPrefix(char);
+BOOL       IsWindow(HWND);
+BOOL       IsWindowEnabled(HWND);
+BOOL       IsWindowVisible(HWND);
+BOOL       IsZoomed(HWND);
+BOOL       KillSystemTimer(HWND,WORD);
+BOOL       KillTimer(HWND,WORD);
+BOOL       LPtoDP(HDC,LPPOINT,int);
+void       LimitEmsPages(DWORD);
+void       LineDDA(short,short,short,short,FARPROC,long);
+BOOL       LineTo(HDC,short,short);
+HANDLE     LoadAccelerators(HANDLE,SEGPTR);
+HBITMAP    LoadBitmap(HANDLE,SEGPTR);
+HCURSOR    LoadCursor(HANDLE,SEGPTR);
+HICON      LoadIcon(HANDLE,SEGPTR);
+HANDLE     LoadLibrary(LPCSTR);
+HMENU      LoadMenu(HANDLE,SEGPTR);
+HMENU      LoadMenuIndirect(LPSTR);
+HANDLE     LoadModule(LPCSTR,LPVOID);
+HANDLE     LoadResource(HANDLE,HANDLE);
+int        LoadString(HANDLE,WORD,LPSTR,int);
+HANDLE     LocalAlloc(WORD,WORD);
+#ifndef WINELIB32 /* Obsolete in Win32 */
+UINT       LocalCompact(WORD);
+#endif
+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);
+#ifndef WINELIB32 /* Obsolete in Win32 */
+UINT       LocalShrink(HANDLE,WORD);
+#endif
+UINT       LocalSize(HLOCAL);
+BOOL       LocalUnlock(HANDLE);
+LPSTR      LockResource(HANDLE);
+HGLOBAL    LockSegment(HGLOBAL);
+HMENU      LookupMenuHandle(HMENU,INT);
+FARPROC    MakeProcInstance(FARPROC,HANDLE);
+void       MapDialogRect(HWND,LPRECT);
+WORD       MapVirtualKey(WORD,WORD);
+void       MapWindowPoints(HWND,HWND,LPPOINT,WORD);
+void       MessageBeep(WORD);
+int        MessageBox(HWND,LPSTR,LPSTR,WORD);
+BOOL       ModifyMenu(HMENU,UINT,UINT,UINT,LPSTR);
+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);
+int        OffsetClipRgn(HDC,short,short);
+void       OffsetRect(LPRECT,short,short);
+int        OffsetRgn(HRGN,short,short);
+DWORD      OffsetViewportOrg(HDC,short,short);
+BOOL       OffsetViewportOrgEx(HDC,short,short,LPPOINT);
+DWORD      OffsetWindowOrg(HDC,short,short);
+BOOL       OffsetWindowOrgEx(HDC,short,short,LPPOINT);
+BOOL       OpenClipboard(HWND);
+int        OpenComm(LPSTR,UINT,UINT);
+INT        OpenFile(LPCSTR,LPOFSTRUCT,UINT);
+BOOL       OpenIcon(HWND);
+int        OpenSound(void);
+void       OutputDebugString(LPSTR);
+void       PaintRect(HWND,HWND,HDC,HBRUSH,LPRECT);
+BOOL       PaintRgn(HDC,HRGN);
+BOOL       PatBlt(HDC,short,short,short,short,DWORD);
+BOOL       PeekMessage(LPMSG,HWND,WORD,WORD,WORD);
+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       Polygon(HDC,LPPOINT,int);
+BOOL       Polyline(HDC,LPPOINT,int);
+BOOL       PostAppMessage(HANDLE,WORD,WORD,LONG);
+BOOL       PostMessage(HWND,WORD,WORD,LONG);
+void       PostQuitMessage(int);
+WORD       PrestoChangoSelector(WORD,WORD);
+void       ProfClear(void);
+void       ProfFinish(void);
+void       ProfFlush(void);
+int        ProfInsChk(void);
+void       ProfSampRate(int,int);
+void       ProfSetup(int,int);
+void       ProfStart(void);
+void       ProfStop(void);
+BOOL       PtInRect(LPRECT,POINT);
+BOOL       PtInRegion(HRGN,short,short);
+BOOL       PtVisible(HDC,short,short);
+int        ReadComm(int,LPSTR,int);
+WORD       RealizeDefaultPalette(HDC);
+UINT       RealizePalette(HDC);
+BOOL       RectInRegion(HRGN,LPRECT);
+BOOL       RectVisible(HDC,LPRECT);
+BOOL       Rectangle(HDC,int,int,int,int);
+BOOL       RedrawWindow(HWND,LPRECT,HRGN,UINT);
+ATOM       RegisterClass(LPWNDCLASS);
+WORD       RegisterClipboardFormat(LPCSTR);
+WORD       RegisterWindowMessage(SEGPTR);
+void       ReleaseCapture(void);
+int        ReleaseDC(HWND,HDC);
+BOOL       RemoveFontResource(LPSTR);
+BOOL       RemoveMenu(HMENU,UINT,UINT);
+HANDLE     RemoveProp(HWND,SEGPTR);
+void       ReplyMessage(LONG);
+BOOL       ResizePalette(HPALETTE,UINT);
+BOOL       RestoreDC(HDC,short);
+int        RestoreVisRgn(HDC);
+BOOL       RoundRect(HDC,short,short,short,short,short,short);
+int        SaveDC(HDC);
+HRGN       SaveVisRgn(HDC);
+DWORD      ScaleViewportExt(HDC,short,short,short,short);
+BOOL       ScaleViewportExtEx(HDC,short,short,short,short,LPSIZE);
+DWORD      ScaleWindowExt(HDC,short,short,short,short);
+BOOL       ScaleWindowExtEx(HDC,short,short,short,short,LPSIZE);
+void       ScreenToClient(HWND,LPPOINT);
+BOOL       ScrollDC(HDC,short,short,LPRECT,LPRECT,HRGN,LPRECT);
+void       ScrollWindow(HWND,short,short,LPRECT,LPRECT);
+int        ScrollWindowEx(HWND,short,short,LPRECT,LPRECT,HRGN,LPRECT,WORD);
+int        SelectClipRgn(HDC,HRGN);
+HANDLE     SelectObject(HDC,HANDLE);
+HPALETTE   SelectPalette(HDC,HPALETTE,BOOL);
+int        SelectVisRgn(HDC,HRGN);
+WORD       SelectorAccessRights(WORD,WORD,WORD);
+LONG       SendDlgItemMessage(HWND,INT,UINT,WPARAM,LPARAM);
+LRESULT    SendMessage(HWND,UINT,WPARAM,LPARAM);
+HWND       SetActiveWindow(HWND);
+LONG       SetBitmapBits(HBITMAP,LONG,LPSTR);
+DWORD      SetBitmapDimension(HBITMAP,short,short);
+BOOL       SetBitmapDimensionEx(HBITMAP,short,short,LPSIZE);
+DWORD      SetBkColor(HDC,COLORREF);
+WORD       SetBkMode(HDC,WORD);
+DWORD      SetBrushOrg(HDC,short,short);
+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);
+int        SetCommBreak(int);
+UINT*      SetCommEventMask(int,UINT);
+int        SetCommState(DCB*);
+void       SetConvertHook(BOOL);
+BOOL       SetConvertParams(int,int);
+HCURSOR    SetCursor(HCURSOR);
+void       SetCursorPos(short,short);
+void       SetDCState(HDC,HDC);
+int        SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+int        SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+BOOL       SetDeskPattern(void);
+BOOL       SetDeskWallPaper(LPSTR);
+void       SetDlgItemInt(HWND,WORD,WORD,BOOL);
+void       SetDlgItemText(HWND,WORD,SEGPTR);
+void       SetDoubleClickTime(WORD);
+int        SetEnvironment(LPSTR,LPSTR,WORD);
+BOOL       SetErrorMode(WORD);
+HWND       SetFocus(HWND);
+WORD       SetHandleCount(WORD);
+void       SetInternalWindowPos(HWND,WORD,LPRECT,LPPOINT);
+void       SetKeyboardState(BYTE*);
+WORD       SetMapMode(HDC,WORD);
+DWORD      SetMapperFlags(HDC,DWORD);
+BOOL       SetMenu(HWND,HMENU);
+BOOL       SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
+BOOL       SetMessageQueue(int);
+HANDLE     SetMetaFileBits(HANDLE);
+WORD       SetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
+HWND       SetParent(HWND,HWND);
+COLORREF   SetPixel(HDC,short,short,COLORREF);
+WORD       SetPolyFillMode(HDC,WORD);
+BOOL       SetProp(HWND,SEGPTR,HANDLE);
+WORD       SetROP2(HDC,WORD);
+void       SetRect(LPRECT,short,short,short,short);
+void       SetRectEmpty(LPRECT);
+void       SetRectRgn(HRGN,short,short,short,short);
+WORD       SetRelAbs(HDC,WORD);
+FARPROC    SetResourceHandler(HANDLE,LPSTR,FARPROC);
+int        SetScrollPos(HWND,int,int,BOOL);
+void       SetScrollRange(HWND,int,int,int,BOOL);
+WORD       SetSelectorBase(WORD,DWORD);
+WORD       SetSelectorLimit(WORD,DWORD);
+int        SetSoundNoise(int,int);
+WORD       SetStretchBltMode(HDC,WORD);
+LONG       SetSwapAreaSize(WORD);
+void       SetSysColors(int,LPINT,COLORREF*);
+HWND       SetSysModalWindow(HWND);
+WORD       SetSystemPaletteUse(HDC,WORD);
+WORD       SetSystemTimer(HWND,WORD,WORD,FARPROC);
+HGLOBAL    SetTaskQueue(HTASK,HGLOBAL);
+WORD       SetTextAlign(HDC,WORD);
+short      SetTextCharacterExtra(HDC,short);
+DWORD      SetTextColor(HDC,DWORD);
+short      SetTextJustification(HDC,short,short);
+WORD       SetTimer(HWND,WORD,WORD,FARPROC);
+DWORD      SetViewportExt(HDC,short,short);
+BOOL       SetViewportExtEx(HDC,short,short,LPSIZE);
+DWORD      SetViewportOrg(HDC,short,short);
+BOOL       SetViewportOrgEx(HDC,short,short,LPPOINT);
+int        SetVoiceAccent(int,int,int,int,int);
+int        SetVoiceEnvelope(int,int,int);
+int        SetVoiceNote(int,int,int,int);
+int        SetVoiceQueueSize(int,int);
+int        SetVoiceSound(int,LONG,int);
+int        SetVoiceThreshold(int,int);
+BOOL       SetWinDebugInfo(LPWINDEBUGINFO);
+DWORD      SetWindowExt(HDC,short,short);
+BOOL       SetWindowExtEx(HDC,short,short,LPSIZE);
+LONG       SetWindowLong(HWND,short,LONG);
+DWORD      SetWindowOrg(HDC,short,short);
+BOOL       SetWindowOrgEx(HDC,short,short,LPPOINT);
+BOOL       SetWindowPlacement(HWND,LPWINDOWPLACEMENT);
+BOOL       SetWindowPos(HWND,HWND,INT,INT,INT,INT,WORD);
+void       SetWindowText(HWND,LPSTR);
+WORD       SetWindowWord(HWND,short,WORD);
+FARPROC    SetWindowsHook(short,FARPROC);
+HHOOK      SetWindowsHookEx(short,HOOKPROC,HINSTANCE,HTASK);
+void       ShowCaret(HWND);
+int        ShowCursor(BOOL);
+void       ShowOwnedPopups(HWND,BOOL);
+void       ShowScrollBar(HWND,WORD,BOOL);
+BOOL       ShowWindow(HWND,int);
+DWORD      SizeofResource(HANDLE,HRSRC);
+int        StartSound(void);
+int        StopSound(void);
+BOOL       StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
+int        StretchDIBits(HDC,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
+BOOL       SubtractRect(LPRECT,LPRECT,LPRECT);
+BOOL       SwapMouseButton(BOOL);
+void       SwapRecording(WORD);
+void       SwitchStackBack(void);
+void       SwitchStackTo(WORD,WORD,WORD);
+int        SyncAllVoices(void);
+LONG       TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT,short);
+BOOL       TextOut(HDC,short,short,LPSTR,short);
+int        Throw(LPCATCHBUF,int);
+int        ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
+BOOL       TrackPopupMenu(HMENU,UINT,short,short,short,HWND,LPRECT);
+int        TranslateAccelerator(HWND,HANDLE,LPMSG);
+BOOL       TranslateMDISysAccel(HWND,LPMSG);
+BOOL       TranslateMessage(LPMSG);
+int        TransmitCommChar(int,char);
+int        UngetCommChar(int,char);
+BOOL       UnhookWindowsHook(short,FARPROC);
+BOOL       UnhookWindowsHookEx(HHOOK);
+BOOL       UnionRect(LPRECT,LPRECT,LPRECT);
+void       UnlockSegment(HGLOBAL);
+BOOL       UnrealizeObject(HBRUSH);
+BOOL       UnregisterClass(SEGPTR,HANDLE);
+int        UpdateColors(HDC);
+void       UpdateWindow(HWND);
+void       ValidateCodeSegments(void);
+LPSTR      ValidateFreeSpaces(void);
+void       ValidateRect(HWND,LPRECT);
+void       ValidateRgn(HWND,HRGN);
+WORD       VkKeyScan(WORD);
+SEGPTR     WIN16_GlobalLock(HGLOBAL);
+SEGPTR     WIN16_LockResource(HANDLE);
+void       WaitMessage(void);
+int        WaitSoundState(int);
+HANDLE     WinExec(LPSTR,WORD);
+BOOL       WinHelp(HWND,LPSTR,WORD,DWORD);
+HWND       WindowFromPoint(POINT);
+int        WriteComm(int,LPSTR,int);
+BOOL       WritePrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR);
+BOOL       WriteProfileString(LPSTR,LPSTR,LPSTR);
+void       Yield(void);
+LONG       _hread(INT,LPSTR,LONG);
+LONG       _hwrite(INT,LPCSTR,LONG);
+INT        _lclose(INT);
+INT        _lcreat(LPSTR,INT);
+LONG       _llseek(INT,LONG,INT);
+INT        _lopen(LPSTR,INT);
+INT        _lread(INT,LPSTR,WORD);
+INT        _lwrite(INT,LPCSTR,WORD);
+SEGPTR     lstrcat(SEGPTR,SEGPTR);
+INT        lstrcmp(LPCSTR,LPCSTR);
+INT        lstrcmpi(LPCSTR,LPCSTR);
+SEGPTR     lstrcpy(SEGPTR,SEGPTR);
+SEGPTR     lstrcpyn(SEGPTR,SEGPTR,WORD);
+INT        lstrlen(LPCSTR);
+int        wvsprintf(LPSTR,LPSTR,LPSTR);
 
 #ifdef WINELIB
 #define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
diff --git a/include/wine.h b/include/wine.h
index f6748e0..29b6c44 100644
--- a/include/wine.h
+++ b/include/wine.h
@@ -14,13 +14,9 @@
 #endif
 
 
-#if defined ( linux) || defined(__svr4__)
-/*
- * SVR4 NOTE:
- * This is not correct but gets it through the compiler
- * Must come back and look at this again
- */
-struct sigcontext_struct {
+#if defined ( linux) 
+struct sigcontext_struct
+{
 	unsigned short sc_gs, __gsh;
 	unsigned short sc_fs, __fsh;
 	unsigned short sc_es, __esh;
@@ -44,20 +40,21 @@
 	unsigned long oldmask;
 	unsigned long cr2;
 };
-#ifdef linux
 #define WINE_DATA_SELECTOR 0x2b
 #define WINE_CODE_SELECTOR 0x23
-#endif
-#ifdef __svr4__
-#define WINE_DATA_SELECTOR 0x1f
-#define WINE_CODE_SELECTOR 0x17
-#endif
 #endif  /* linux */
 
 #ifdef __NetBSD__
 #include <signal.h>
 #define sigcontext_struct sigcontext
-#define HZ 100
+#define WINE_DATA_SELECTOR 0x1f
+#define WINE_CODE_SELECTOR 0x17
+#endif
+
+#ifdef __svr4__
+#include <signal.h>
+#include <sys/ucontext.h>
+#define sigcontext_struct ucontext
 #define WINE_DATA_SELECTOR 0x1f
 #define WINE_CODE_SELECTOR 0x17
 #endif
@@ -65,7 +62,6 @@
 #ifdef __FreeBSD__
 #include <signal.h>
 #define sigcontext_struct sigcontext
-#define HZ 100
 #define WINE_DATA_SELECTOR 0x27
 #define WINE_CODE_SELECTOR 0x1f
 #endif
diff --git a/include/winerror.h b/include/winerror.h
index e1c1dbf..ec4ba25 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -1,2 +1,12 @@
 extern int WIN32_LastError;
-#define	ERROR_CALL_NOT_IMPLEMENTED	120
+
+/* ERROR_UNKNOWN is a placeholder for error conditions which haven't
+ * been tested yet so we're not exactly sure what will be returned.
+ * All instances of ERROR_UNKNOWN should be tested under Win95/NT
+ * and replaced.
+ */
+#define     ERROR_UNKNOWN               99999
+
+#define     ERROR_INVALID_HANDLE        6
+#define     ERROR_INVALID_PARAMETER     87
+#define     ERROR_CALL_NOT_IMPLEMENTED  120
diff --git a/include/winnls.h b/include/winnls.h
index 77d3890..003ad2f 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -1,3 +1,6 @@
+#ifndef __WINE_WINNLS_H
+#define __WINE_WINNLS_H
+
 #define LOCALE_ILANGUAGE            0x00000001   
 #define LOCALE_SLANGUAGE            0x00000002   
 #define LOCALE_SENGLANGUAGE         0x00001001   
@@ -102,3 +105,5 @@
 #define NORM_IGNORENONSPACE			2
 #define NORM_IGNORESYMBOLS			4
 #define NORM_STRINGSORT				0x1000
+
+#endif  /* __WINE_WINNLS_H */
diff --git a/include/winsock.h b/include/winsock.h
index 46471ac..6223573 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -65,6 +65,7 @@
 #ifndef _SYS_SOCKET_H_
 #ifndef _sys_socket_h
 #ifndef _NET_TRANSPORT_SOCKET_H
+#ifndef _NET_SOCKET_H
 /*
  * Structure used by kernel to pass protocol
  * information in raw sockets.
@@ -76,6 +77,7 @@
 #endif
 #endif
 #endif
+#endif
 
 /*
  * Maximum queue length specifiable by listen.
diff --git a/include/wintypes.h b/include/wintypes.h
index ff785d1..eb917b5 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -79,6 +79,7 @@
 DECLARE_HANDLE(HMODULE);
 DECLARE_HANDLE(HPALETTE);
 DECLARE_HANDLE(HPEN);
+DECLARE_HANDLE(HQUEUE);
 DECLARE_HANDLE(HRGN);
 DECLARE_HANDLE(HRSRC);
 DECLARE_HANDLE(HTASK);
@@ -137,4 +138,13 @@
 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
 #endif
 
+#ifndef DONT_DEFINE_min_AND_max
+#ifndef min
+#define min(a,b) MIN(a,b)
+#endif
+#ifndef max
+#define max(a,b) MAX(a,b)
+#endif
+#endif
+
 #endif /* __WINE_WINTYPES_H */
diff --git a/loader/main.c b/loader/main.c
index 08ad7cd..de7df1e 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -58,10 +58,10 @@
 
       /* Initialize Win32 relay code */
     if (!RELAY32_Init()) return 0;
+#endif
 
       /* Create built-in modules */
     if (!MODULE_Init()) return 0;
-#endif
 
       /* Initialize the DOS file system */
     DOS_InitFS();
diff --git a/loader/module.c b/loader/module.c
index 7186c93..2a95c4a 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -29,15 +29,16 @@
 static HMODULE hFirstModule = 0;
 static HMODULE hCachedModule = 0;  /* Module cached by MODULE_OpenFile */
 
-
+#ifndef WINELIB
 static HANDLE hInitialStack32 = 0;
+#endif
 /***********************************************************************
  *           MODULE_LoadBuiltin
  *
  * Load a built-in module. If the 'force' parameter is FALSE, we only
  * load the module if it has not been disabled via the -dll option.
  */
-#ifndef WINELIB /* JBP: Not really allowed in libwine.a (FIXME:?) */
+#ifndef WINELIB
 static HMODULE MODULE_LoadBuiltin( LPCSTR name, BOOL force )
 {
     HMODULE hModule;
@@ -705,7 +706,7 @@
     }
 
     if (sel == 0xfe) sel = 0xffff;  /* constant entry */
-    else sel = NE_SEG_TABLE(pModule)[sel-1].selector;
+    else sel = (WORD)NE_SEG_TABLE(pModule)[sel-1].selector;
     return MAKELONG( offset, sel );
 }
 
@@ -912,7 +913,7 @@
     HANDLE hInstance, hPrevInstance;
     NE_MODULE *pModule;
     LOADPARAMS *params = (LOADPARAMS *)paramBlock;
-#ifndef WINELIB /* JBP: Disabled for now in winelib.a */
+#ifndef WINELIB
     WORD *pModRef, *pDLLs;
     int i, fd;
 
@@ -1195,9 +1196,15 @@
  */
 HANDLE LoadLibrary( LPCSTR libname )
 {
+#ifdef WINELIB
+    dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
+    WINELIB_UNIMP("LoadLibrary()");
+    return (HANDLE)0;
+#else
     HANDLE handle;
 
     dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
+
     /* This does not increment the module reference count, and will
      * therefore cause crashes on FreeLibrary calls.
     if ((handle = MODULE_FindModule( libname )) != 0) return handle;
@@ -1212,6 +1219,7 @@
     }
     if (handle >= (HANDLE)32) NE_InitializeDLLs( GetExePtr(handle) );
     return handle;
+#endif
 }
 
 
@@ -1326,12 +1334,23 @@
 }
 
 
-#ifndef WINELIB
+/**********************************************************************
+ *	    GetExpWinVer    (KERNEL.167)
+ */
+WORD GetExpWinVer( HMODULE hModule )
+{
+    NE_MODULE *pModule = (NE_MODULE *)GlobalLock( hModule );
+
+    return pModule->expected_version;
+}
+
+
 /***********************************************************************
  *           GetWndProcEntry16 (not a Windows API function)
  *
  * Return an entry point from the WINPROCS dll.
  */
+#ifndef WINELIB
 WNDPROC GetWndProcEntry16( char *name )
 {
     WORD ordinal;
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 9774817..eff083e 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
 /*
  * NE modules
  *
@@ -532,3 +533,4 @@
 void PatchCodeHandle(HANDLE hSel)
 {
 }
+#endif /* WINELIB */
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index a83f639..18fd164 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
 /*
  *
  * Copyright 1993 Robert J. Amstadt
@@ -206,10 +207,6 @@
                                        pTypeInfo->count * sizeof(NE_NAMEINFO));
         }
     }
-    fprintf( stderr, "FindResource('%*.*s',%08lx,%08lx): Not found.\n",
-             *((BYTE *)pModule + pModule->name_table),
-             *((BYTE *)pModule + pModule->name_table),
-             (char *)pModule + pModule->name_table + 1, typeId, resId );
     return 0;
 }
 
@@ -362,3 +359,4 @@
     fprintf( stderr, "FreeResource: "NPFMT" "NPFMT" not found!\n", hModule, handle );
     return FALSE;
 }
+#endif /* WINELIB */
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 47c9d87..cfd9e08 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
 /* 
  *  Copyright	1994	Eric Youndale & Erik Bos
  *
@@ -107,7 +108,7 @@
   int fixup_failed=0;
 
  /* OK, now dump the import list */
-  printf("\nDumping imports list\n");
+  dprintf_win32(stddeb, "\nDumping imports list\n");
   pe_imp = pe_imports;
   while (pe_imp->ModuleName)
     {
@@ -117,7 +118,7 @@
       char * c;
 
       Module = ((char *) load_addr) + pe_imp->ModuleName;
-      printf("%s\n", Module);
+      dprintf_win32(stddeb, "%s\n", Module);
       c = strchr(Module, '.');
       if (c) *c = 0;
 
@@ -135,7 +136,7 @@
 	  	fprintf(stderr,"Import by ordinal not supported\n");
 		exit(0);
 	  }
-	  printf("--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
+	  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=(unsigned int)RELAY32_GetEntryPoint(Module,pe_name->Name,pe_name->Hint);
 #else
@@ -159,11 +160,11 @@
 {
   int i;
 
-  printf("Dump of segment table\n");
-  printf("   Name    VSz  Vaddr     SzRaw   Fileadr  *Reloc *Lineum #Reloc #Linum Char\n");
+  dprintf_win32(stddeb, "Dump of segment table\n");
+  dprintf_win32(stddeb, "   Name    VSz  Vaddr     SzRaw   Fileadr  *Reloc *Lineum #Reloc #Linum Char\n");
   for(i=0; i< wpnt->pe->pe_header->coff.NumberOfSections; i++)
     {
-      printf("%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n", 
+      dprintf_win32(stddeb, "%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n", 
 	     wpnt->pe->pe_seg[i].Name, 
 	     wpnt->pe->pe_seg[i].Virtual_Size,
 	     wpnt->pe->pe_seg[i].Virtual_Address,
@@ -200,7 +201,7 @@
 			wpnt->pe->pe_header->coff.NumberOfSections);
 
 	load_addr = wpnt->pe->pe_header->opt_coff.BaseOfImage;
-	printf("Load addr is %x\n",load_addr);
+	dprintf_win32(stddeb, "Load addr is %x\n",load_addr);
 	dump_table(wpnt);
 
 	for(i=0; i < wpnt->pe->pe_header->coff.NumberOfSections; i++)
@@ -366,7 +367,7 @@
 	int fs;
 	struct w_files *wpnt=wine_files;
 	fs=(int)GlobalAlloc(GHND,0x10000);
-	fprintf(stddeb,"Going to start Win32 program\n");	
+	dprintf_win32(stddeb,"Going to start Win32 program\n");	
 	InitTask(context);
 	USER_InitApp(wpnt->hModule);
 	__asm__ __volatile__("movw %w0,%%fs"::"r" (fs));
@@ -387,3 +388,4 @@
 		printf("InitPEDLL() called!\n");
 	}
 }
+#endif /* WINELIB */
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 0bfc987..b9a356d 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
 /*
  *	(c) 1994	Erik Bos	<erik@xs4all.nl>
  *
@@ -150,3 +151,5 @@
 	return find_type(r->wpnt->pe->pe_resource, resource_name, type_name);
 }
 #endif
+
+#endif /* WINELIB */
diff --git a/loader/resource.c b/loader/resource.c
index 437d8e2..42b45cc 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -23,6 +23,7 @@
 #include "resource.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "libres.h"
 
 #define PrintId(name) \
     if (HIWORD((DWORD)name)) \
@@ -41,10 +42,18 @@
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     dprintf_resource(stddeb, "FindResource: module="NPFMT" type=", hModule );
     PrintId( type );
+    if (HIWORD(name))  /* Check for '#xxx' name */
+    {
+	char *ptr = PTR_SEG_TO_LIN( name );
+	if (ptr[0] == '#') {
+	    if (!(name = (SEGPTR)atoi( ptr + 1 ))) return 0;
+	}
+    }
     dprintf_resource( stddeb, " name=" );
     PrintId( name );
     dprintf_resource( stddeb, "\n" );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -54,6 +63,9 @@
       default:
         return 0;
     }
+#else
+    return LIBRES_FindResource( hModule, type, name );
+#endif
 }
 
 
@@ -69,6 +81,7 @@
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -78,6 +91,9 @@
       default:
         return 0;
     }
+#else
+    return LIBRES_LoadResource( hModule, hRsrc );
+#endif
 }
 
 
@@ -94,6 +110,7 @@
     if (!handle) return (SEGPTR)0;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -103,6 +120,9 @@
       default:
         return 0;
     }
+#else
+    return LIBRES_LockResource( hModule, handle );
+#endif
 }
 
 /* 32-bit version */
@@ -115,6 +135,7 @@
     if (!handle) return NULL;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -124,6 +145,9 @@
       default:
         return 0;
     }
+#else
+    return LIBRES_LockResource( hModule, handle );
+#endif
 }
 
 
@@ -139,6 +163,7 @@
     if (!handle) return FALSE;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -148,6 +173,9 @@
       default:
         return FALSE;
     }
+#else
+    return LIBRES_FreeResource( hModule, handle );
+#endif
 }
 
 
@@ -163,6 +191,7 @@
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -172,6 +201,9 @@
       default:
         return 0;
     }
+#else
+        return LIBRES_AccessResource( hModule, hRsrc );
+#endif
 }
 
 
@@ -186,6 +218,7 @@
     dprintf_resource(stddeb, "SizeofResource: module="NPFMT" res="NPFMT"\n",
                      hModule, hRsrc );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -195,6 +228,9 @@
       default:
         return 0;
     }
+#else
+    return LIBRES_SizeofResource( hModule, hRsrc );
+#endif
 }
 
 
@@ -210,6 +246,7 @@
                      hModule, hRsrc, size );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
+#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -219,6 +256,9 @@
       default:
         return 0;
     }
+#else
+    return LIBRES_AllocResource( hModule, hRsrc, size );
+#endif
 }
 
 /**********************************************************************
diff --git a/loader/signal.c b/loader/signal.c
index 8a31b8d..6150f72 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -18,7 +18,6 @@
 #include "miscemu.h"
 #include "registers.h"
 #include "win.h"
-#include "xmalloc.h"
 
 #if !defined(BSD4_4) || defined(linux) || defined(__FreeBSD__)
 char * cstack[4096];
@@ -46,20 +45,25 @@
 #endif
 
 
-#if defined(linux) || defined(__svr4__)
+#if defined(linux) 
 static void win_fault(int signal, struct sigcontext_struct context_struct)
 {
     struct sigcontext_struct *context = &context_struct;
+#elif defined(__svr4__)
+static void win_fault(int signal, void *siginfo, ucontext_t *context)
+{
 #else
 static void win_fault(int signal, int code, struct sigcontext *context)
 {
 #endif
+    int i;
+    
     if (signal != SIGTRAP)
     {
         if (CS_reg(context) == WINE_CODE_SELECTOR)
         {
-            fprintf(stderr, "Segmentation fault in Wine program (%04x:%08lx)."
-                            "  Please debug.\n",
+            fprintf(stderr, "Segmentation fault in Wine program (%x:%lx)."
+                            "  Please debug\n",
                             CS_reg(context), EIP_reg(context) );
         }
         else if (INSTR_EmulateInstruction( context )) return;
@@ -100,11 +104,15 @@
         sigset_t sig_mask;
         struct sigaltstack ss;
         
-#if !defined (__FreeBSD__)
-        ss.ss_base = xmalloc (MINSIGSTKSZ);
+#if !defined (__FreeBSD__) 
+        if ((ss.ss_base = malloc(MINSIGSTKSZ)) == NULL) {
 #else
-        ss.ss_sp = xmalloc (MINSIGSTKSZ);
+        if ((ss.ss_sp = malloc(MINSIGSTKSZ)) == NULL) {
 #endif
+	        fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
+		        MINSIGSTKSZ);
+		exit(1);
+	}
 	ss.ss_size = MINSIGSTKSZ;
         ss.ss_flags = 0;
         if (sigaltstack(&ss, NULL) < 0) {
@@ -143,6 +151,56 @@
         }
 #endif  /* CONFIG_IPC */
 #endif  /* __FreeBSD__ || __NetBSD__ */
+#if defined (__svr4__)
+        sigset_t sig_mask;
+        struct sigaltstack ss;
+        
+        if ((ss.ss_sp = malloc(SIGSTKSZ) ) == NULL) {
+            fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
+                    SIGSTKSZ);
+            exit(1);
+	}
+        ss.ss_size = SIGSTKSZ;
+        ss.ss_flags = 0;
+        if (sigaltstack(&ss, NULL) < 0) {
+            perror("sigstack");
+            exit(1);
+        }
+        sigemptyset(&sig_mask);
+        segv_act.sa_handler = (void (*)) win_fault;
+	segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+        segv_act.sa_mask = sig_mask;
+	if (sigaction(SIGBUS, &segv_act, NULL) < 0) {
+            perror("sigaction: SIGBUS");
+            exit(1);
+        }
+        segv_act.sa_handler = (void (*)) win_fault;
+	segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+        segv_act.sa_mask = sig_mask;
+	if (sigaction(SIGSEGV, &segv_act, NULL) < 0) {
+            perror("sigaction: SIGSEGV");
+            exit(1);
+        }
+        
+
+        segv_act.sa_handler = (void (*)) win_fault; /* For breakpoints */
+	segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+        segv_act.sa_mask = sig_mask;
+	if (sigaction(SIGTRAP, &segv_act, NULL) < 0) {
+            perror("sigaction: SIGTRAP");
+            exit(1);
+        }
+#ifdef CONFIG_IPC
+        usr2_act.sa_handler = (void (*)) stop_wait; /* For breakpoints */
+	usr2_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+        usr2_act.sa_mask = sig_mask;
+	if (sigaction(SIGUSR2, &usr2_act, NULL) < 0) {
+            perror("sigaction: SIGUSR2");
+            exit(1);
+        }
+#endif  /* CONFIG_IPC */
+        
+#endif  /* __svr4__ */
 }
 
 #endif /* ifndef WINELIB */
diff --git a/loader/task.c b/loader/task.c
index ae8e2d5..bf383cd 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -419,7 +419,11 @@
     pTask->hPrevInstance = hPrevInstance;
     pTask->hModule       = hModule;
     pTask->hParent       = hCurrentTask;
+#ifdef WINELIB
+    pTask->curdrive      = 'C' - 'A' + 0x80;
+#else
     pTask->curdrive      = filename[0] - 'A' + 0x80;
+#endif
     pTask->magic         = TDB_MAGIC;
     pTask->nCmdShow      = cmdShow;
     strcpy( pTask->curdir, filename+2 );
@@ -710,7 +714,7 @@
     INSTANCEDATA *pinstance;
     LONG stacklow, stackhi;
 
-    context.sc_eax = 0;
+    EAX_reg(&context) = 0;
     if (!(pTask = (TDB *)GlobalLock( hCurrentTask ))) return;
     if (!(pModule = (NE_MODULE *)GlobalLock( pTask->hModule ))) return;
 
@@ -730,7 +734,9 @@
         firstTask = 0;
     }
 
+#ifndef WINELIB
     NE_InitializeDLLs( pTask->hModule );
+#endif
 
     /* Registers on return are:
      * ax     1 if OK, 0 on error
@@ -740,13 +746,13 @@
      * di     instance handle of the new task
      * es:bx  pointer to command-line inside PSP
      */
-    context.sc_eax = 1;
-    context.sc_ebx = 0x81;
-    context.sc_ecx = pModule->stack_size;
-    context.sc_edx = pTask->nCmdShow;
-    context.sc_esi = (DWORD)pTask->hPrevInstance;
-    context.sc_edi = (DWORD)pTask->hInstance;
-    context.sc_es  = (WORD)pTask->hPDB;
+    EAX_reg(&context) = 1;
+    EBX_reg(&context) = 0x81;
+    ECX_reg(&context) = pModule->stack_size;
+    EDX_reg(&context) = pTask->nCmdShow;
+    ESI_reg(&context) = (DWORD)pTask->hPrevInstance;
+    EDI_reg(&context) = (DWORD)pTask->hInstance;
+    ES_reg (&context) = (WORD)pTask->hPDB;
 
     /* Initialize the local heap */
     if ( pModule->heap_size )
@@ -970,6 +976,28 @@
 
 
 /***********************************************************************
+ *           GetTaskQueueDS  (KERNEL.118)
+ */
+#ifndef WINELIB
+void GetTaskQueueDS( struct sigcontext_struct context )
+{
+    DS_reg(&context) = GlobalHandleToSel( GetTaskQueue(0) );
+}
+#endif  /* WINELIB */
+
+
+/***********************************************************************
+ *           GetTaskQueueES  (KERNEL.119)
+ */
+#ifndef WINELIB
+void GetTaskQueueES( struct sigcontext_struct context )
+{
+    ES_reg(&context) = GlobalHandleToSel( GetTaskQueue(0) );
+}
+#endif  /* WINELIB */
+
+
+/***********************************************************************
  *           GetCurrentTask   (KERNEL.36)
  */
 HTASK GetCurrentTask(void)
diff --git a/memory/selector.c b/memory/selector.c
index 8ca361a..5b42003 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -316,7 +316,7 @@
     }
     else  /* set */
     {
-        entry.read_only = (val & 2 == 0);
+        entry.read_only = ((val & 2) == 0);
         entry.type = (val >> 2) & 3;
         entry.seg_32bit = val & 0x4000;
         entry.limit_in_pages = val & 0x8000;
diff --git a/misc/comm.c b/misc/comm.c
index bce491c..06501cc 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -626,9 +626,8 @@
 		port.c_cflag |= CRTSCTS;
 
 	if (lpdcb->fDtrDisable) 
-#endif
 		port.c_cflag &= ~CRTSCTS;
-	
+#endif	
 	if (lpdcb->fInX)
 		port.c_iflag |= IXON;
 	if (lpdcb->fOutX)
@@ -727,16 +726,17 @@
 	lpdcb->fNull = 0;
 	lpdcb->fChEvt = 0;
 	lpdcb->fBinary = 1;
+	lpdcb->fDtrDisable = 0;
 
 #ifndef __svr4__
-	lpdcb->fDtrDisable = 0;
+
 	if (port.c_cflag & CRTSCTS) {
 		lpdcb->fDtrflow = 1;
 		lpdcb->fRtsflow = 1;
 		lpdcb->fOutxCtsFlow = 1;
 		lpdcb->fOutxDsrFlow = 1;
-#endif
 	} else 
+#endif
 		lpdcb->fDtrDisable = 1;
 
 	if (port.c_iflag & IXON)
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 5b86ad3..73df1d1 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -509,11 +509,10 @@
 	tmpstr2[0] = 'A'+ drive;
 	tmpstr2[1] = ':';
 	tmpstr2[2] = '\\';
-	strncpy(tmpstr2 + 3, DOS_GetCurrentDir(drive), 510); tmpstr2[510]=0;
+	strncpy(tmpstr2 + 3, DOS_GetCurrentDir(drive), 507); tmpstr2[510]=0;
 	if (strlen(tmpstr2) > 3)
-	  strcat(tmpstr2, "\\");
+	   strcat(tmpstr2, "\\");
 	strncat(tmpstr2, tmpstr, 511-strlen(tmpstr2)); tmpstr2[511]=0;
-	printf("strcpy'ing '%s'\n",tmpstr2); fflush(stdout);
 	strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2);
       }
       lpofn->nFileOffset = 0;
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 13f52bf..28cdf30 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -24,6 +24,7 @@
 #if defined(__NetBSD__) || defined(__FreeBSD__)
 #include <sys/param.h>
 #include <sys/mount.h>
+#include <sys/errno.h>
 #endif
 #ifdef __svr4__
 #include <sys/statfs.h>
@@ -38,11 +39,6 @@
 #include "debug.h"
 #include "xmalloc.h"
 
-#ifndef WINE_INI_GLOBAL
-/* Get the WINE_INI_GLOBAL definition from autoconf.h */
-#include "autoconf.h"
-#endif
-
 #define WINE_INI_USER "~/.winerc"
 #define MAX_DOS_DRIVES	26
 
@@ -50,7 +46,6 @@
 
 char WindowsPath[256];
 
-static int max_open_dirs = 0;
 static int CurrentDrive = 2;
 
 struct DosDriveStruct {			/*  eg: */
@@ -206,7 +201,7 @@
 {
     int x;
     char drive[2], temp[256];
-    
+    struct dosdirent *dp;    
     GetPrivateProfileString("wine", "windows", "c:\\windows", 
 			    WindowsDirectory, sizeof(WindowsDirectory), WINE_INI);
     
@@ -295,9 +290,12 @@
 			  DosDrives[x].disabled);	
 	}
     }
-    
-    for (x=0; x!=max_open_dirs ; x++)
-        DosDirs[x].inuse = 0;
+    dp = DosDirs;
+    while (dp)
+    {
+        dp->inuse = 0;
+        dp = dp->next;
+    }
 
     dprintf_dosfs(stddeb,"wine.ini = %s\n",WINE_INI);
     dprintf_dosfs(stddeb,"win.ini = %s\n",WIN_INI);
@@ -582,8 +580,11 @@
     strcat(temp, dirname);
     ToUnix(temp);
     DOS_SimplifyPath(temp);
-    mkdir(temp,0);	
-    
+    if (mkdir(temp, S_IRWXU | S_IRWXG | S_IRWXO) == -1)
+    {
+        dprintf_dosfs(stddeb, "DOS_MakeDir: %c:\%s => %s failed errno %d",'A'+drive, dirname, temp, errno);
+        return 0;
+    }
     dprintf_dosfs(stddeb, "DOS_MakeDir: %c:\%s => %s",'A'+drive, dirname, temp);
     return 1;
 }
@@ -845,10 +846,11 @@
 
 struct dosdirent *DOS_opendir(char *dosdirname)
 {
-    int x, len;
+    int len;
     char *unixdirname;
     char dirname[256];
     DIR  *ds;
+    struct dosdirent *dp;
     
     if ((unixdirname = DOS_GetUnixFileName(dosdirname)) == NULL) return NULL;
     
@@ -856,43 +858,51 @@
     strncpy(dirname, unixdirname, len);
     dirname[len] = 0;
     unixdirname = strrchr(unixdirname, '/') + 1;
+    if ((ds = opendir(dirname)) == NULL)
+        return NULL;
 
-    for (x=0; x <= max_open_dirs; x++) {
-	if (x == max_open_dirs) {
-	    if (DosDirs) {
-		DosDirs=(struct dosdirent*)xrealloc(DosDirs,(++max_open_dirs)*sizeof(DosDirs[0]));
-	    } else {
-		DosDirs=(struct dosdirent*)xmalloc(sizeof(DosDirs[0]));
-		max_open_dirs=1;
-	    }
-	    break; /* this one is definitely not in use */
-	}
-	if (!DosDirs[x].inuse) break;
-	if (strcmp(DosDirs[x].unixpath, dirname) == 0) break;
+    dp = DosDirs;
+    while (dp)
+    {
+        if (dp->inuse)
+            break;
+        if (strcmp(dp->unixpath, dirname) == 0)
+            break;
+        dp = dp->next;
+    }
+    if (!dp)
+    {
+        dp = xmalloc(sizeof(struct dosdirent));
+        dp->next = DosDirs;
+        DosDirs = dp;
     }
     
-    strncpy(DosDirs[x].filemask, unixdirname, 12);
-    DosDirs[x].filemask[12] = 0;
+    strncpy(dp->filemask, unixdirname, 12);
+    dp->filemask[12] = 0;
     dprintf_dosfs(stddeb,"DOS_opendir: %s / %s\n", unixdirname, dirname);
 
-    DosDirs[x].inuse = 1;
-    strcpy(DosDirs[x].unixpath, dirname);
-    DosDirs[x].entnum = 0;
+    dp->inuse = 1;
+    strcpy(dp->unixpath, dirname);
+    dp->entnum = 0;
 
-    if ((ds = opendir(dirname)) == NULL) return NULL;
-    if (-1==(DosDirs[x].telldirnum=telldir(ds))) {
+    if ((dp->telldirnum=telldir(ds)) == -1)
+    {
+        dp->inuse = 0;
 	closedir(ds);
 	return NULL;
     }
-    if (-1==closedir(ds)) return NULL;
-
-    return &DosDirs[x];
+    if (closedir(ds) == -1) 
+    {
+        dp->inuse = 0;
+        return NULL;
+    }
+    return dp;
 }
 
 
 struct dosdirent *DOS_readdir(struct dosdirent *de)
 {
-	char temp[256];
+	char temp[WINE_PATH_LENGTH];
 	struct dirent *d;
 	struct stat st;
 	DIR	*ds;
diff --git a/misc/file.c b/misc/file.c
index 1d18e83..888701a 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -50,7 +50,7 @@
   switch(iReadWrite & 3)
   {
   case OF_READ:      mode = O_RDONLY; break;
-  case OF_WRITE:     mode = O_WRONLY; break;
+  case OF_WRITE:     mode = O_WRONLY | O_TRUNC; break;
   case OF_READWRITE: mode = O_RDWR; break;
   }
   handle = open( UnixFileName, mode );
@@ -148,7 +148,7 @@
     int          res, handle;
     int          verify_time = 0;
   
-    dprintf_file(stddeb,"Openfile(%s,<struct>,%d)\n",lpFileName,wStyle);
+    dprintf_file(stddeb,"Openfile(%s,<struct>,%X)\n",lpFileName,wStyle);
  
     action = wStyle & 0xff00;
   
@@ -171,7 +171,10 @@
             ofs->nErrCode = ExtendedError;
             return -1;
         }
-        handle = open (unixfilename, (wStyle & 0x0003) | O_CREAT, 0666);
+	/* Apparently, at least the OF_READ parameter is ignored when
+	 * a file is created. Using O_RDWR makes the most sense.
+	 */
+        handle = open (unixfilename, O_TRUNC | O_RDWR | O_CREAT, 0666);
         if (handle == -1)
         {
             errno_to_doserr();
@@ -253,8 +256,8 @@
         return 0;
 
     if (action & OF_DELETE)
-      return unlink(ofs->szPathName);
-
+      return unlink(DOS_GetUnixFileName(ofs->szPathName));
+    /* FIXME: I suppose we should check return codes here like stat below */
 
     /* Now on to getting some information about that file */
 
diff --git a/misc/lstr.c b/misc/lstr.c
index a37b6de..b79c3b3 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -138,7 +138,10 @@
     if (HIWORD(strOrChar))
     {
         char *s = PTR_SEG_TO_LIN(strOrChar);
-        while (*s) *s++ = ToUpper( *s );
+        while (*s) {
+	    *s = ToUpper( *s );
+	    s++;
+	}
         return strOrChar;
     }
     else return (SEGPTR)ToUpper( (int)strOrChar );
@@ -151,7 +154,10 @@
   /* I am not sure if the locale stuff works with toupper, but then again 
      I am not sure if the Linux libc locale stuffs works at all */
 
-    while (*s) *s++ = ToUpper( *s );
+    while (*s) {
+	*s = ToUpper( *s );
+	s++;
+    }
     return strOrChar;
 }
 
@@ -183,7 +189,10 @@
     if (HIWORD(strOrChar))
     {
         char *s = PTR_SEG_TO_LIN( strOrChar );
-        while (*s) *s++ = ToLower( *s );
+        while (*s) {	    
+	    *s = ToLower( *s );
+	    s++;
+	}
         return strOrChar;
     }
     else return (SEGPTR)ToLower( (int)strOrChar );
@@ -196,7 +205,10 @@
   /* I am not sure if the locale stuff works with toupper, but then again 
      I am not sure if the Linux libc locale stuffs works at all */
 
-    while (*s) *s++ = ToLower( *s );
+    while (*s) {
+	*s = ToLower( *s );
+	s++;
+    }
     return strOrChar;
 }
 
@@ -231,23 +243,25 @@
 
 
 /* AnsiToOem Keyboard.5 */
-INT AnsiToOem(LPSTR lpAnsiStr, LPSTR lpOemStr)   /* why is this int ??? */
+INT AnsiToOem(LPSTR lpAnsiStr, LPSTR lpOemStr)
 {
-  while(*lpAnsiStr){
-    *lpOemStr++=Ansi2Oem[(unsigned char)(*lpAnsiStr++)];
-  }
-  *lpOemStr = 0;
-  return -1;
+    dprintf_keyboard(stddeb, "AnsiToOem: %s\n", lpAnsiStr);
+    while(*lpAnsiStr){
+	*lpOemStr++=Ansi2Oem[(unsigned char)(*lpAnsiStr++)];
+    }
+    *lpOemStr = 0;
+    return -1;
 }
 
 /* OemToAnsi Keyboard.6 */
-BOOL OemToAnsi(LPSTR lpOemStr, LPSTR lpAnsiStr)   /* why is this BOOL ???? */
+BOOL OemToAnsi(LPSTR lpOemStr, LPSTR lpAnsiStr)
 {
-  while(*lpOemStr){
-    *lpAnsiStr++=Oem2Ansi[(unsigned char)(*lpOemStr++)];
-  }
-  *lpAnsiStr = 0;
-  return -1;
+    dprintf_keyboard(stddeb, "OemToAnsi: %s\n", lpOemStr);
+    while(*lpOemStr){
+	*lpAnsiStr++=Oem2Ansi[(unsigned char)(*lpOemStr++)];
+    }
+    *lpAnsiStr = 0;
+    return -1;
 }
 
 /* AnsiToOemBuff Keyboard.134 */
diff --git a/misc/main.c b/misc/main.c
index 9de2fe7..8f2a426 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -44,6 +44,18 @@
 "Gregory Trubetskoy, Michael Veksler, Morten Welinder, Jan Willamowius, "
 "Carl Williams, Karl Guenter Wuensch, Eric Youngdale, and James Youngman.";
 
+static const char *langNames[] =
+{
+    "En",  /* LANG_En */
+    "Es",  /* LANG_Es */
+    "De",  /* LANG_De */
+    "No",  /* LANG_No */
+    "Fr",  /* LANG_Fr */
+    "Fi",  /* LANG_Fi */
+    "Da",  /* LANG_Da */
+    NULL
+};
+
 #define WINE_CLASS    "Wine"    /* Class name for resources */
 
 typedef struct tagENVENTRY {
@@ -75,7 +87,13 @@
     FALSE,
     FALSE,          /* AllowReadOnly */
     FALSE,          /* Enhanced mode */
-    FALSE           /* IPC enabled */
+    FALSE,          /* IPC enabled */
+#ifdef DEFAULT_LANG
+    DEFAULT_LANG    /* Default language */
+#else
+    LANG_En
+#endif
+
 };
 
 
@@ -87,6 +105,7 @@
     { "-display",       ".display",         XrmoptionSepArg, (caddr_t)NULL },
     { "-iconic",        ".iconic",          XrmoptionNoArg,  (caddr_t)"on" },
     { "-ipc",           ".ipc",             XrmoptionNoArg,  (caddr_t)"off"},
+    { "-language",      ".language",        XrmoptionSepArg, (caddr_t)"En" },
     { "-name",          ".name",            XrmoptionSepArg, (caddr_t)NULL },
     { "-privatemap",    ".privatemap",      XrmoptionNoArg,  (caddr_t)"on" },
     { "-fixedmap",      ".fixedmap",        XrmoptionNoArg,  (caddr_t)NULL },
@@ -110,6 +129,7 @@
   "    -iconic         Start as an icon\n" \
   "    -ipc            Enable IPC facilities\n" \
   "    -debug          Enter debugger before starting application\n" \
+  "    -language xx    Set the language (one of En,Es,De,No,Fr,Fi,Da)\n" \
   "    -name name      Set the application name\n" \
   "    -privatemap     Use a private color map\n" \
   "    -fixedmap       Use a \"standard\" color map\n" \
@@ -272,6 +292,28 @@
 
 
 /***********************************************************************
+ *           MAIN_ParseLanguageOption
+ *
+ * Parse -language option.
+ */
+static void MAIN_ParseLanguageOption( char *arg )
+{
+    const char **p = langNames;
+
+    Options.language = LANG_En;  /* First language */
+    for (p = langNames; *p; p++)
+    {
+        if (!strcasecmp( *p, arg )) return;
+        Options.language++;
+    }
+    fprintf( stderr, "Invalid language specified '%s'. Supported languages are: ", arg );
+    for (p = langNames; *p; p++) fprintf( stderr, "%s ", *p );
+    fprintf( stderr, "\n" );
+    exit(1);
+}
+
+
+/***********************************************************************
  *           MAIN_ParseOptions
  *
  * Parse command line options and open display.
@@ -329,6 +371,8 @@
 	screenDepth = atoi( value.addr );
     if (MAIN_GetResource( db, ".desktop", &value))
 	Options.desktopGeometry = value.addr;
+    if (MAIN_GetResource( db, ".language", &value))
+        MAIN_ParseLanguageOption( (char *)value.addr );
 #ifdef DEBUG_RUNTIME
     if (MAIN_GetResource( db, ".debugoptions", &value))
 	ParseDebugOptions((char*)value.addr);
@@ -610,7 +654,7 @@
 {
 	LPENVENTRY	lpNewEnv;
 	LPENVENTRY	lpEnv = lpEnvList;
-	printf("SetEnvironnement('%s', '%s', %d) !\n", 
+	dprintf_env(stddeb, "SetEnvironnement('%s', '%s', %d) !\n", 
 				lpPortName, lpEnviron, nCount);
 	if (lpPortName == NULL) return -1;
 	while (lpEnv != NULL) {
@@ -621,28 +665,28 @@
 				free(lpEnv->Value);
 				free(lpEnv->Name);
 				free(lpEnv);
-				printf("SetEnvironnement() // entry deleted !\n");
+				dprintf_env(stddeb, "SetEnvironnement() // entry deleted !\n");
 				return -1;
 				}
 			free(lpEnv->Value);
 			lpEnv->Value = malloc(nCount);
 			if (lpEnv->Value == NULL) {
-				printf("SetEnvironment() // Error allocating entry value !\n");
+				dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
 				return 0;
 			}
 			memcpy(lpEnv->Value, lpEnviron, nCount);
 			lpEnv->wSize = nCount;
-			printf("SetEnvironnement() // entry modified !\n");
+			dprintf_env(stddeb, "SetEnvironnement() // entry modified !\n");
 			return nCount;
 			}
 		if (lpEnv->Next == NULL) break;
 		lpEnv = lpEnv->Next;
 		}
 	if (nCount == 0 || lpEnviron == NULL) return -1;
-	printf("SetEnvironnement() // new entry !\n");
+	dprintf_env(stddeb, "SetEnvironnement() // new entry !\n");
 	lpNewEnv = malloc(sizeof(ENVENTRY));
 	if (lpNewEnv == NULL) {
-		printf("SetEnvironment() // Error allocating new entry !\n");
+		dprintf_env(stddeb, "SetEnvironment() // Error allocating new entry !\n");
 		return 0;
 		}
 	if (lpEnvList == NULL) {
@@ -656,13 +700,13 @@
 	lpNewEnv->Next = NULL;
 	lpNewEnv->Name = malloc(strlen(lpPortName) + 1);
 	if (lpNewEnv->Name == NULL) {
-		printf("SetEnvironment() // Error allocating entry name !\n");
+		dprintf_env(stddeb, "SetEnvironment() // Error allocating entry name !\n");
 		return 0;
 		}
 	strcpy(lpNewEnv->Name, lpPortName);
 	lpNewEnv->Value = malloc(nCount);
 	if (lpNewEnv->Value == NULL) {
-		printf("SetEnvironment() // Error allocating entry value !\n");
+		dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
 		return 0;
 		}
 	memcpy(lpNewEnv->Value, lpEnviron, nCount);
@@ -688,18 +732,18 @@
 {
 	WORD		nCount;
 	LPENVENTRY	lpEnv = lpEnvList;
-	printf("GetEnvironnement('%s', '%s', %d) !\n",
+	dprintf_env(stddeb, "GetEnvironnement('%s', '%s', %d) !\n",
 					lpPortName, lpEnviron, nMaxSiz);
 	while (lpEnv != NULL) {
 		if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
 			nCount = MIN(nMaxSiz, lpEnv->wSize);
 			memcpy(lpEnviron, lpEnv->Value, nCount);
-			printf("GetEnvironnement() // found '%s' !\n", lpEnviron);
+			dprintf_env(stddeb, "GetEnvironnement() // found '%s' !\n", lpEnviron);
 			return nCount;
 			}
 		lpEnv = lpEnv->Next;
 		}
-	printf("GetEnvironnement() // not found !\n");
+	dprintf_env(stddeb, "GetEnvironnement() // not found !\n");
 	return 0;
 }
 
diff --git a/misc/profile.c b/misc/profile.c
index 7dce512..080c3dc 100644
--- a/misc/profile.c
+++ b/misc/profile.c
@@ -20,6 +20,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 
 #include "wine.h"
 #include "windows.h"
@@ -34,8 +35,6 @@
 #define STRSIZE 255
 #define overflow (next == &CharBuffer [STRSIZE-1])
 
-enum { FirstBrace, OnSecHeader, IgnoreToEOL, KeyDef, KeyValue };
-
 typedef struct TKeys {
     char *KeyName;
     char *Value;
@@ -93,14 +92,16 @@
 static TSecHeader *load (char *filename, char **pfullname)
 {
     FILE *f;
-    int state;
     TSecHeader *SecHeader = 0;
     char CharBuffer [STRSIZE];
-    char *next = '\0';
+    char *bufptr;
+    char *lastnonspc;
+    int bufsize;
     char *file;
-    char c;
+    int c;
     char path[MAX_PATH+1];
-
+    BOOL firstbrace;
+    
     *pfullname = NULL;
 
     /* Try the Windows directory */
@@ -135,96 +136,99 @@
     *pfullname = strdup(file);
     dprintf_profile(stddeb,"Loading %s\n", file);
 
-
-    state = FirstBrace;
-    next = CharBuffer;
-    while ((c = fgetc (f)) != EOF){
-	if (c == '\r')		/* Ignore Carriage Return */
+    firstbrace = TRUE;
+    for(;;) {	
+	c = fgetc(f);
+	if (c == EOF) goto finished;
+	
+	if (isspace(c))
 	    continue;
 	
-	switch (state){
-
-	case OnSecHeader:
-	    if (c == ']' || overflow){
-		*next = '\0';
-		next = CharBuffer;
-		SecHeader->AppName = strdup (CharBuffer);
-		state = IgnoreToEOL;
-		dprintf_profile(stddeb,"%s: section %s\n", file, CharBuffer);
-	    } else
-		*next++ = c;
-	    break;
-
-	case IgnoreToEOL:
-	    if (c == '\n'){
-		state = KeyDef;
-		next = CharBuffer;
-	    }
-	    break;
-
-	case FirstBrace:
-	case KeyDef:
-	    if (c == '['){
-		TSecHeader *temp;
-		
-		temp = SecHeader;
-		SecHeader = (TSecHeader *) xmalloc (sizeof (TSecHeader));
-		SecHeader->link = temp;
-		SecHeader->Keys = 0;
-		state = OnSecHeader;
-		next = CharBuffer;
-		break;
-	    }
-	    if (state == FirstBrace) /* On first pass, don't allow dangling keys */
-		break;
-
-	    if (c == '\t')
-		break;
+	if (c == '[') {
+	    TSecHeader *temp = SecHeader;
 	    
-	    if (c == '\n' || c == ';' || overflow) /* Abort Definition */
-		next = CharBuffer;
-
-	    if (c == ';')
-	    {
-		state = IgnoreToEOL;
-		break;
-	    }
-
-	    if (c == '\n')
-	      break;
+	    SecHeader = (TSecHeader *) xmalloc (sizeof (TSecHeader));
+	    SecHeader->link = temp;
+	    SecHeader->Keys = NULL;
+	    do {
+		c = fgetc(f);
+		if (c == EOF) goto bad_file;
+	    } while (isspace(c));
+	    bufptr = lastnonspc = CharBuffer;
+	    bufsize = 0;
+	    do {
+		if (c != ']') {
+		    bufsize++;
+		    *bufptr++ = c;
+		    if (!isspace(c))
+		    	lastnonspc = bufptr;
+		} else
+		    break;
+		c = fgetc(f);
+		if (c == EOF) goto bad_file;
+	    } while(bufsize < STRSIZE-1);
+	    *lastnonspc = 0;
+	    if (!strlen(CharBuffer))
+	    	fprintf(stderr, "warning: empty section name in ini file\n");
+	    SecHeader->AppName = strdup (CharBuffer);
+	    dprintf_profile(stddeb,"%s: section %s\n", file, CharBuffer);
+	    firstbrace = FALSE;
+	} else if (SecHeader) {
+	    TKeys *temp = SecHeader->Keys;
+	    BOOL skipspc;
 	    
-	    if (c == '=' || overflow){
-		TKeys *temp;
+	    if (firstbrace)
+	    	goto bad_file;
+	    bufptr = lastnonspc = CharBuffer;
+	    bufsize = 0;
+	    do {
+		if (c != '=') {
+		    bufsize++;
+		    *bufptr++ = c;
+		    if (!isspace(c))
+		    	lastnonspc = bufptr;
+		} else
+		    break;
+		c = fgetc(f);
+		if (c == EOF) goto bad_file;
+	    } while(bufsize < STRSIZE-1);
+	    *lastnonspc = 0;
+	    if (!strlen(CharBuffer))
+	    	fprintf(stderr, "warning: empty key name in ini file\n");
+	    SecHeader->Keys = (TKeys *) xmalloc (sizeof (TKeys));
+	    SecHeader->Keys->link = temp;
+	    SecHeader->Keys->KeyName = strdup (CharBuffer);
 
-		temp = SecHeader->Keys;
-		while(next[-1]==' ')next--;
-		*next = '\0';
-		SecHeader->Keys = (TKeys *) xmalloc (sizeof (TKeys));
-		SecHeader->Keys->link = temp;
-		SecHeader->Keys->KeyName = strdup (CharBuffer);
-		state = KeyValue;
-		next = CharBuffer;
-		dprintf_profile(stddeb,"%s:   key %s\n", file, CharBuffer);
-	    } else {
-		*next++ = c;
-	    }
-	    break;
-
-	case KeyValue:
-	    if (overflow || c == '\n'){
-		*next = '\0';
-		SecHeader->Keys->Value = strdup (CharBuffer);
-		state = c == '\n' ? KeyDef : IgnoreToEOL;
-		next = CharBuffer;
-		dprintf_profile (stddeb, "[%s] (%s)=%s\n", SecHeader->AppName,
-			SecHeader->Keys->KeyName, SecHeader->Keys->Value);
-	    } else
-		*next++ = c;
-	    break;
+	    dprintf_profile(stddeb,"%s:   key %s\n", file, CharBuffer);
 	    
-	} /* switch */
-	
-    } /* while ((c = fgetc (f)) != EOF) */
+	    bufptr = lastnonspc = CharBuffer;
+	    bufsize = 0;
+	    skipspc = TRUE;
+	    do {
+		c = fgetc(f);
+		if (c == EOF) break;
+		if (c != '\n') {
+		    if (!isspace(c) || !skipspc) {
+			skipspc = FALSE;
+			bufsize++;
+			*bufptr++ = c;
+			if (!isspace(c))
+		    	    lastnonspc = bufptr;
+		    }
+		} else
+		    break;
+	    } while(bufsize < STRSIZE-1);
+	    *lastnonspc = 0;
+	    SecHeader->Keys->Value = strdup (CharBuffer);
+	    dprintf_profile (stddeb, "[%s] (%s)=%s\n", SecHeader->AppName,
+			     SecHeader->Keys->KeyName, SecHeader->Keys->Value);
+	    
+	}
+
+    }
+bad_file:
+    fprintf(stderr, "warning: bad ini file\n");
+finished:
     return SecHeader;
 }
 
diff --git a/misc/spy.c b/misc/spy.c
index 2d4c430..6c9692a 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -170,7 +170,7 @@
 
     /* 0x0130 */
     NULL, 
-    "WM_LBTRACKPOINT", 
+    "wm_lbtrackpoint", 
     NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
@@ -251,12 +251,12 @@
     "WM_MDIICONARRANGE",        /* 0x0228 */
     "WM_MDIGETACTIVE",          /* 0x0229 */
 
-    "WM_DROPOBJECT", 
-    "WM_QUERYDROPOBJECT", 
-    NULL,
-    "WM_DRAGLOOP",
-    "WM_DRAGSELECT",
-    "WM_DRAGMOVE",
+    "wm_dropobject", 
+    "wm_querydropobject", 
+    "wm_begindrag",
+    "wm_dragloop",
+    "wn_dragselect",
+    "wm_dragmove",
      
     /* 0x0230*/
     "WM_MDISETMENU",            /* 0x0230 */
diff --git a/misc/user32.c b/misc/user32.c
index b91b749..a9ce9af 100644
--- a/misc/user32.c
+++ b/misc/user32.c
@@ -155,6 +155,8 @@
     strcpy( classbuf, class );
     titlebuf = alloca( strlen(title)+1 );
     strcpy( titlebuf, title );
-    return CreateWindowEx( flags, MAKE_SEGPTR(classbuf), MAKE_SEGPTR(titlebuf),
-                           style,x,y,width,height,parent,menu,instance,param );
+    return (DWORD) CreateWindowEx(flags,MAKE_SEGPTR(classbuf),
+				  MAKE_SEGPTR(titlebuf),style,x,y,width,height,
+				  (HWND)parent,(HMENU)menu,(HINSTANCE)instance,
+				  param);
 }
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 52baf78..318c38e 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -11,6 +11,10 @@
 #include <sys/types.h>
 #include <sys/ipc.h>
 #include <sys/ioctl.h>
+#ifdef __svr4__
+#include <sys/filio.h>
+#include <sys/ioccom.h>
+#endif
 #include <sys/msg.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -19,6 +23,7 @@
 #include <errno.h>
 #include <netdb.h>
 #include <unistd.h>
+#undef TRANSPARENT
 #include "winsock.h"
 #include "toolhelp.h"
 #include "stddebug.h"
@@ -196,15 +201,15 @@
 	case EPROCLIM:		return WSAEPROCLIM;
 #endif
 	case EUSERS:		return WSAEUSERS;
+#ifdef EDQUOT
 	case EDQUOT:		return WSAEDQUOT;
+#endif
 	case ESTALE:		return WSAESTALE;
 	case EREMOTE:		return WSAEREMOTE;
 /* just in case we ever get here and there are no problems */
 	case 0:			return 0;
 
-#ifdef EDQUOT
         default:
-#endif
 		fprintf(stderr, "winsock: unknown errorno %d!\n", errno);
 		return WSAEOPNOTSUPP;
 	}
@@ -241,9 +246,8 @@
 /* just in case we ever get here and there are no problems */
 	case 0:			return 0;
 
-#ifdef EDQUOT
+
         default:
-#endif
 		fprintf(stderr, "winsock: unknown h_errorno %d!\n", h_errno);
 		return WSAEOPNOTSUPP;
 	}
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 0228602..8c6fac4 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -555,6 +555,8 @@
 	  {
 #ifdef __svr4__
               printf("Should call flock and needs porting to lockf\n");
+              result = 0;
+              retries = 0;
 #else
 	    result = flock(handle, lock | LOCK_NB);
 #endif
@@ -634,7 +636,7 @@
             return;
 	}
 
-	if ((mkdir(dirname,0) == -1)  && errno!=EEXIST) {
+	if ((mkdir(dirname, S_IRWXU | S_IRWXG | S_IRWXO) == -1)  && errno!=EEXIST) {
             Error( CanNotMakeDir, EC_AccessDenied, EL_Disk );
             AX_reg(context) = CanNotMakeDir;
             SET_CFLAG(context);
@@ -693,7 +695,7 @@
 	struct dosdirent *dp;
         struct tm *t;
 	BYTE *dta = GetCurrentDTA();
-
+        
         memcpy(&dp, dta+0x11, sizeof(dp));
 
         dprintf_int(stddeb, "int21: FindNext, dta %p, dp %p\n", dta, dp);
@@ -716,13 +718,14 @@
 	setword(&dta[0x18], ((t->tm_year - 80) << 9) + (t->tm_mon << 5) +
                 (t->tm_mday)); /* date */
 	setdword(&dta[0x1a], dp->filesize);
-	strncpy(dta + 0x1e, dp->filename, 13);
+	strncpy(dta + 0x1e, dp->filename, 12);
+        *(dta + 0x1e + 13) = 0;
+        AnsiUpper(dta+0x1e);
 
 	AX_reg(context) = 0;
 	RESET_CFLAG(context);
 
         dprintf_int(stddeb, "int21: FindNext -- (%s) index=%d size=%ld\n", dp->filename, dp->entnum, dp->filesize);
-	return;
 }
 
 static void FindFirst(struct sigcontext_struct *context)
@@ -761,6 +764,7 @@
 	dp->search_attribute = ECX_reg(context) & (FA_LABEL | FA_DIREC);
 	memcpy(dta + 0x11, &dp, sizeof(dp));
 	FindNext(context);
+
 }
 
 static void GetFileDateTime(struct sigcontext_struct *context)
@@ -1459,6 +1463,9 @@
                 ioctlGetDeviceInfo(&context);
 		break;
 
+	      case 0x01:
+
+	        break;
               case 0x08:   /* Check if drive is removable. */
                 drive = BL_reg(&context) ? (BL_reg(&context) - 1)
                                         : DOS_GetDefaultDrive();
diff --git a/miscemu/int2f.c b/miscemu/int2f.c
index 779f6b7..7501c76 100644
--- a/miscemu/int2f.c
+++ b/miscemu/int2f.c
@@ -40,6 +40,8 @@
     case 0x4a:
         switch(AL_reg(&context))
         {
+	case 0x10:  /* smartdrv */
+	    break;  /* not installed */
         case 0x12:  /* realtime compression interface */
             break;  /* not installed */
         default:
diff --git a/objects/bitmap.c b/objects/bitmap.c
index dde4d94..72e18ad 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -150,15 +150,20 @@
     LONG height;
     XImage * image;
     
+    /* KLUDGE! */
+    if (count < 0) {
+	fprintf(stderr, "Negative number of bytes (%ld) passed to GetBitmapBits???\n", count );
+	count = -count;
+    }
     bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     if (!bmp) return 0;
 
-    dprintf_bitmap(stddeb, "GetBitmapBits: %dx%d %d colors %p\n",
-	    bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
-	    1 << bmp->bitmap.bmBitsPixel, buffer );
       /* Only get entire lines */
     height = count / bmp->bitmap.bmWidthBytes;
     if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight;
+    dprintf_bitmap(stddeb, "GetBitmapBits: %dx%d %d colors %p fetched height: %ld\n",
+	    bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
+	    1 << bmp->bitmap.bmBitsPixel, buffer, height );
     if (!height) return 0;
     
     if (!(image = BITMAP_BmpToImage( &bmp->bitmap, buffer ))) return 0;
@@ -180,6 +185,11 @@
     LONG height;
     XImage * image;
     
+    /* KLUDGE! */
+    if (count < 0) {
+	fprintf(stderr, "Negative number of bytes (%ld) passed to SetBitmapBits???\n", count );
+	count = -count;
+    }
     bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     if (!bmp) return 0;
 
diff --git a/objects/color.c b/objects/color.c
index 41e222c..03cefa9 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -15,15 +15,15 @@
 #include "xmalloc.h"
 
 Colormap COLOR_WinColormap = 0;
-int COLOR_FixedMap = 0;
+static int COLOR_FixedMap = 0;
 
-int COLOR_Redshift = 0;
-int COLOR_Redmax = 0;
-int COLOR_Greenshift = 0;
-int COLOR_Greenmax = 0;
-int COLOR_Blueshift = 0;
-int COLOR_Bluemax = 0;
-int COLOR_Graymax = 0;
+static int COLOR_Redshift = 0;
+static int COLOR_Redmax = 0;
+static int COLOR_Greenshift = 0;
+static int COLOR_Greenmax = 0;
+static int COLOR_Blueshift = 0;
+static int COLOR_Bluemax = 0;
+static int COLOR_Graymax = 0;
 
   /* System palette static colors */
 
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index fcb553e..4dc22b2 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -33,6 +33,7 @@
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
+#include "task.h"
 
 
 Cursor CURSORICON_XCursor = None;  /* Current X cursor */
@@ -411,6 +412,40 @@
     return hNew;
 }
 
+/***********************************************************************
+ *           CURSORICON_IconToCursor
+ *
+ * Should convert bitmap to mono and truncate if too large
+ * FIXME: if icon is passed returns a copy of OCR_DRAGOBJECT cursor
+ *	  but should actually convert icon to cursor.
+ */
+HCURSOR CURSORICON_IconToCursor(HICON hIcon)
+{
+ CURSORICONINFO *ptr = NULL;
+
+ if(hIcon)
+    if (!(ptr = (CURSORICONINFO*)GlobalLock( hIcon ))) return FALSE;
+       if (ptr->bPlanes * ptr->bBitsPerPixel == 1)
+          {
+            return hIcon; /* assuming it's a cursor */
+          }
+       else 
+	  {
+	   /* kludge */
+
+	   HTASK hTask = GetCurrentTask();
+	   TDB*  pTask = (TDB *)GlobalLock(hTask);
+
+	   if(!pTask) return 0;
+
+           fprintf( stdnimp, "IconToCursor: Icons are not supported, returning default!\n");
+	   return CURSORICON_Copy( pTask->hInstance ,
+				   CURSORICON_Load(0,MAKEINTRESOURCE(OCR_DRAGOBJECT),
+				                   SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE) );
+	  }
+
+ return 0;
+}
 
 /***********************************************************************
  *           LoadCursor    (USER.173)
@@ -453,7 +488,7 @@
 HICON CreateCursor( HANDLE hInstance, INT xHotSpot, INT yHotSpot,
                     INT nWidth, INT nHeight, LPSTR lpANDbits, LPSTR lpXORbits)
 {
-    CURSORICONINFO info = { { xHotSpot, yHotSpot }, nWidth, nHeight, 1, 1 };
+    CURSORICONINFO info = { { xHotSpot, yHotSpot }, nWidth, nHeight, 0, 1, 1 };
 
     dprintf_cursor( stddeb, "CreateCursor: %dx%d spot=%d,%d xor=%p and=%p\n",
                     nWidth, nHeight, xHotSpot, yHotSpot, lpXORbits, lpANDbits);
@@ -467,7 +502,7 @@
 HICON CreateIcon( HANDLE hInstance, INT nWidth, INT nHeight, BYTE bPlanes,
                   BYTE bBitsPixel, LPSTR lpANDbits, LPSTR lpXORbits)
 {
-    CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, bPlanes, bBitsPixel };
+    CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, 0, bPlanes, bBitsPixel };
 
     dprintf_icon( stddeb, "CreateIcon: %dx%dx%d, xor=%p, and=%p\n",
                   nWidth, nHeight, bPlanes * bBitsPixel, lpXORbits, lpANDbits);
@@ -584,16 +619,17 @@
 /***********************************************************************
  *           DumpIcon    (USER.459)
  */
-DWORD DumpIcon( CURSORICONINFO *info, WORD *lpLen,
-                LPSTR *lpXorBits, LPSTR *lpAndBits )
+DWORD DumpIcon( SEGPTR pInfo, WORD *lpLen,
+                SEGPTR *lpXorBits, SEGPTR *lpAndBits )
 {
+    CURSORICONINFO *info = PTR_SEG_TO_LIN( pInfo );
     int sizeAnd, sizeXor;
 
     if (!info) return 0;
     sizeXor = info->nHeight * info->nWidthBytes;
     sizeAnd = info->nHeight * ((info->nWidth + 15) / 16 * 2);
-    if (lpAndBits) *lpAndBits = (LPSTR)(info + 1);
-    if (lpXorBits) *lpXorBits = (LPSTR)(info + 1) + sizeAnd;
+    if (lpAndBits) *lpAndBits = pInfo + sizeof(CURSORICONINFO);
+    if (lpXorBits) *lpXorBits = pInfo + sizeof(CURSORICONINFO) + sizeAnd;
     if (lpLen) *lpLen = sizeof(CURSORICONINFO) + sizeAnd + sizeXor;
     return MAKELONG( sizeXor, sizeXor );
 }
diff --git a/objects/metafile.c b/objects/metafile.c
index e1d176e..6cc68b6 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -7,6 +7,7 @@
 */
 
 #include <string.h>
+#include <fcntl.h>
 #include "gdi.h"
 #include "bitmap.h"
 #include "metafile.h"
@@ -407,7 +408,7 @@
 	break;
 
     case META_RECTANGLE:
-	Ellipse(hdc, *(mr->rdParam + 3), *(mr->rdParam + 2),
+	Rectangle(hdc, *(mr->rdParam + 3), *(mr->rdParam + 2),
 		*(mr->rdParam + 1), *(mr->rdParam));
 	break;
 
@@ -575,7 +576,7 @@
     HANDLE hMem = mf->hMetaHdr;
     METAHEADER *mh = (METAHEADER *)GlobalLock(hMem);
 
-    dprintf_metafile(stddeb,"GetMetaFileBits: hmf in: %x\n", hmf);
+    dprintf_metafile(stddeb,"GetMetaFileBits: hmf in: "NPFMT"\n", hmf);
 
     /* can't get bits of disk based metafile */
     /* FIXME: should the disk file be loaded in this case? */
@@ -591,7 +592,7 @@
     GlobalUnlock(hMem);
     GlobalFree(hmf);
 
-    dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: %x\n", hMem);
+    dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: "NPFMT"\n", hMem);
 
     return hMem;
 }
@@ -607,7 +608,7 @@
     METAFILE *mf;
     METAHEADER *mh = (METAHEADER *)GlobalLock(hMem);
 
-    dprintf_metafile(stddeb,"SetMetaFileBits: hMem in: %x\n", hMem);
+    dprintf_metafile(stddeb,"SetMetaFileBits: hMem in: "NPFMT"\n", hMem);
 
     if (!mh) return FALSE;
 
@@ -626,12 +627,12 @@
     mf->hMetaHdr = hMem;
     mf->wMagic = METAFILE_MAGIC;
     mf->MetaOffset = mh->mtHeaderSize * 2;
-    mf->hFile = mf->hBuffer = (HANDLE) NULL;
+    mf->hFile = (int) (mf->hBuffer = (HANDLE) NULL);
 
     GlobalUnlock(hMem);
     GlobalUnlock(hmf);
 
-    dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: %x\n", hmf);
+    dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: "NPFMT"\n", hmf);
 
     return hmf;
 }
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index c850994..facd5b4 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -167,19 +167,31 @@
 #include "bitmaps/ocr_sizenesw"
 #include "bitmaps/ocr_sizewe"
 #include "bitmaps/ocr_sizens"
+#include "bitmaps/ocr_bummer"
+#include "bitmaps/ocr_dragobject"
 #if 0
 #include "bitmaps/ocr_sizeall"
 #include "bitmaps/ocr_icocur"
 #endif
 
 /* Cursor are not all contiguous (go figure...) */
+#define OCR_FIRST0 OCR_BUMMER
+#define OCR_LAST0  OCR_DRAGOBJECT
+#define OCR_BASE0	0
+
 #define OCR_FIRST1 OCR_NORMAL
 #define OCR_LAST1  OCR_UP
+#define OCR_BASE1	(OCR_BASE0 + OCR_LAST0 - OCR_FIRST0 + 1)
+
 #define OCR_FIRST2 OCR_SIZE
-#define OCR_LAST2  OCR_SIZENS  /* OCR_ICOCUR */
-#define NB_CURSORS (OCR_LAST2 - OCR_FIRST2 + 1 + OCR_LAST1 - OCR_FIRST1 + 1)
+#define OCR_LAST2  OCR_SIZENS 
+#define OCR_BASE2	(OCR_BASE1 + OCR_LAST1 - OCR_FIRST1 + 1)
+
+#define NB_CURSORS (OCR_BASE2 + OCR_LAST2 - OCR_FIRST2 + 1)
 static char **OBM_Cursors_Data[NB_CURSORS] = 
 {
+    ocr_bummer,	   /* OCR_BUMMER */
+    ocr_dragobject,/* OCR_DRAGOBJECT */ 
     ocr_normal,    /* OCR_NORMAL */
     ocr_ibeam,     /* OCR_IBEAM */
     ocr_wait,      /* OCR_WAIT */
@@ -389,9 +401,11 @@
     if (fCursor)
     {
         if ((id >= OCR_FIRST1) && (id <= OCR_LAST1))
-            id -= OCR_FIRST1;
+             id = OCR_BASE1 + id - OCR_FIRST1;
         else if ((id >= OCR_FIRST2) && (id <= OCR_LAST2))
-            id += (OCR_LAST1 - OCR_FIRST1 + 1) - OCR_FIRST2;
+                  id = OCR_BASE2 + id - OCR_FIRST2;
+	     else if ((id >= OCR_FIRST0) && (id <= OCR_LAST0))
+		       id = OCR_BASE0 + id - OCR_FIRST0;
         else return 0;
         if (OBM_Cursors[id]) return OBM_Cursors[id];
     }
diff --git a/objects/palette.c b/objects/palette.c
index ccd0b42..f49f066 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -135,8 +135,17 @@
  */
 BOOL ResizePalette(HPALETTE hPal, UINT cEntries)
 {
- fprintf(stdnimp,"ResizePalette: empty stub! \n");
- return FALSE;
+    fprintf(stdnimp,"ResizePalette: empty stub! \n");
+    return FALSE;
+}
+
+/***********************************************************************
+ *           AnimatePalette          (GDI.367)
+ */
+void AnimatePalette(HPALETTE hPal, UINT StartIndex, UINT NumEntries,
+		    LPPALETTEENTRY PaletteColors)
+{
+    fprintf(stdnimp,"AnimatePalette: empty stub! \n");
 }
 
 /***********************************************************************
diff --git a/rc/Makefile.in b/rc/Makefile.in
index 0f558c6..f845784 100644
--- a/rc/Makefile.in
+++ b/rc/Makefile.in
@@ -36,5 +36,5 @@
 y.tab.o: y.tab.c y.tab.h parser.h
 lex.yy.o: lex.yy.c y.tab.h parser.h
 winerc.o: $(TOPSRC)/include/windows.h $(TOPSRC)/include/neexe.h parser.h y.tab.h
- 
+
 ### Dependencies:
diff --git a/rc/winerc.c b/rc/winerc.c
index 06f8396..4e1aa52 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -539,13 +539,16 @@
     fprintf( header, "/* %s\n"
                      " * This file is automatically generated. Do not edit!\n"
                      " */\n\n"
+                     "#ifndef __RESOURCE_DEFINED__\n"
+                     "#define __RESOURCE_DEFINED__\n"
                      "struct resource\n"
                      "{\n"
                      "    int id, type;\n"
                      "    char *name;\n"
                      "    unsigned char *bytes;\n"
                      "    unsigned int size;\n"
-                     "};\n\n", hname );
+                     "};\n"
+                     "#endif\n", hname );
 
     /* Declare the resources */
 
diff --git a/toolkit/Makefile.in b/toolkit/Makefile.in
index 55745dd..a1e6cb0 100644
--- a/toolkit/Makefile.in
+++ b/toolkit/Makefile.in
@@ -7,6 +7,7 @@
 	atom.c \
 	arch.c \
 	heap.c \
+	libres.c \
 	miscstubs.c \
 	sup.c \
 	winmain.c
diff --git a/toolkit/README.libres b/toolkit/README.libres
new file mode 100644
index 0000000..880272f
--- /dev/null
+++ b/toolkit/README.libres
@@ -0,0 +1,37 @@
+                        WINElib resources: a proposal
+
+One of the current issues with WINElib is the inadequate support for accessing
+resources by name.  I propose the following technique (which I have already
+begun to implement) to allow this:
+
+   An internal table of resource entries is provided along with a registering
+   function for adding a resource to this table.  'winerc' should construct
+   *.c files much the same way as it does now with the inclusion of a single
+   static 'constructor' function that registers the associated resources with
+   the internal mechanism like so:
+
+      static void DoIt() __attribute__ ((constructor));
+      static void DoIt()
+      {
+        LIBRES_RegisterResource(hello3_MENU_MAIN__bytes,
+                                sizeof(hello3_MENU_MAIN__bytes),
+                                "MAIN",
+                                RT_MENU);
+        LIBRES_RegisterResource(hello3_DIALOG_DIADEMO__bytes,
+                                sizeof(hello3_DIALOG_DIADEMO__bytes),
+                                "DIADEMO",
+                                RT_DIALOG);
+           ... etc. ...
+      }
+
+   The internal table can then be searched for the resource by name.
+
+The only potential drawback I've determined so far is this technique's
+reliance on gcc's 'constructor' attribute, which disallows compilation with
+some other compiler.  However, I'm guessing that WINE is already heavily
+dependent on gcc, so this is probably not too much of a factor.
+
+Any comments/suggestions/criticisms will be greatly appreciated.
+
+Thank you,
+--Jim
diff --git a/toolkit/heap.c b/toolkit/heap.c
index 75faefc..40e52cb 100644
--- a/toolkit/heap.c
+++ b/toolkit/heap.c
@@ -211,47 +211,13 @@
 
 #else /* WINELIB16 */
 
-#ifdef DEBUG_HEAP
-static void* LastTwenty[20]={ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0  };
+typedef struct { DWORD Size; DWORD Padding[3]; } HeapData;
 
-void CheckMem(void* f)
+HANDLE HEAP_Alloc (WORD flags, DWORD bytes)
 {
-  int i;
+    HeapData* m;
 
-  for(i=0; i<20; i++)
-  {
-    if(LastTwenty[i]==f)
-      LastTwenty[i]=NULL;
-    else if(LastTwenty[i])
-      if( *((int*)LastTwenty[i]) != 0x12345678  ||
-	  *(((int*)LastTwenty[i])+1) != 0x0fedcba9 )
-	fprintf(stderr,"memory corrupted at %p\n",LastTwenty[i]);
-  }
-  fflush(stderr);
-}
-
-void NewMem(void* n)
-{
-  int i;
-  for(i=0; i<20; i++)
-    if(!LastTwenty[i])
-    {
-      LastTwenty[i]=n;
-      return;
-    }
-  for(i=0; i<20; i++)
-    LastTwenty[i]=LastTwenty[i+1];
-  LastTwenty[4]=n;
-}
-#endif
-
-HANDLE LocalAlloc (WORD flags, WORD bytes)
-{
-    HANDLE m;
-#ifdef DEBUG_HEAP
-    bytes+=2*sizeof(int);
-#endif
-
+    bytes+=sizeof(HeapData);
     if (flags & LMEM_WINE_ALIGN)
 	m = memalign (4, bytes);
     else
@@ -260,125 +226,118 @@
 	if (flags & LMEM_ZEROINIT)
 	    bzero (m, bytes);
     }
-#ifdef DEBUG_HEAP
-    CheckMem(NULL);
-    *((int*) m)=0x12345678;
-    *(((int*) m)+1)=0x0fedcba9;
-    fprintf(stderr,"%p malloc'd\n",m); fflush(stderr);
-    NewMem(m);
-    return (HANDLE) (((int*)m)+2);
-#endif
-    return m;
+    m->Size=bytes-sizeof(HeapData);
+    return m+1;
 }
 
-WORD LocalCompact (WORD min_free)
+HANDLE HEAP_Free (HANDLE hMem)
 {
-    return min_free;
+  HeapData* m=(HeapData*)hMem;
+  free(m-1);
+  return 0;
 }
 
-WORD LocalFlags (HANDLE hMem)
+DWORD HEAP_Size (HANDLE hMem)
 {
-    return 0;
+  HeapData* m=(HeapData*)hMem;
+  return (m-1)->Size;
+}
+
+HANDLE HEAP_ReAlloc(HANDLE hMem,DWORD bytes,UINT flags)
+{
+  HeapData* m=(HeapData*)hMem;
+  if(!bytes)
+  {
+    free(m-1);
+    return 0; /* Inaccurate behavior, but should suffice */
+  }
+  m=realloc (m-1, bytes+sizeof(HeapData));
+  if(flags & LMEM_ZEROINIT && bytes > m->Size)
+    bzero ((char*)m+sizeof(HeapData)+m->Size, bytes-m->Size);
+  m->Size=bytes;
+  return m+1;
+}
+
+HANDLE LocalAlloc (WORD flags, WORD bytes)
+{
+  return HEAP_Alloc(flags,bytes);
+}
+
+UINT LocalFlags (HANDLE hMem)
+{
+  return 0;
 }
 
 HANDLE LocalFree (HANDLE hMem)
 {
-#ifdef DEBUG_HEAP
-    hMem=(HANDLE) (((int*)hMem)-2);
-    CheckMem(hMem);
-    fprintf(stderr,"%p free-ing...",hMem);
-    if( *((int*)hMem) != 0x12345678  ||
-        *(((int*)hMem)+1) != 0x0fedcba9 )
-      fprintf(stderr,"memory corrupted...");
-    else
-    { 
-      *((int*)hMem) = 0x9abcdef0;
-      *(((int*)hMem)+1) = 0x87654321;
-    }
-    fflush(stderr);
-#endif
-    free(hMem);
-#ifdef DEBUG_HEAP
-    fprintf(stderr,"free'd\n"); fflush(stderr);
-#endif
-    return 0;
+  return HEAP_Free(hMem);
 }
 
 BOOL LocalInit (HANDLE segment, WORD start, WORD end)
 {
-    return TRUE;
+  return TRUE;
 }
 
 LPVOID LocalLock (HANDLE hMem)
 {
+  return hMem;
+}
+
+HANDLE LocalReAlloc (HANDLE hMem, WORD new_size, WORD flags)
+{
+  if (!(flags & LMEM_MODIFY))
+    return HEAP_ReAlloc (hMem, new_size, flags);
+  else
     return hMem;
 }
 
-HANDLE LocalReAlloc (HANDLE hMem, WORD flags, WORD bytes)
+UINT LocalSize (HANDLE hMem)
 {
-#ifdef DEBUG_HEAP
-    LocalFree(hMem);
-    return LocalAlloc(flags,bytes); 
-#endif
-    return realloc(hMem, bytes);
-}
-
-WORD LocalSize (HANDLE hMem)
-{
-    /* Not implemented yet */
-  return 0;
+  return HEAP_Size(hMem);
 }
 
 
 BOOL LocalUnlock (HANDLE hMem)
 {
-    return 0;
+  return 0;
 }
 
 HANDLE GlobalAlloc (WORD flags, DWORD size)
 {
-    return LocalAlloc (flags, size);
+  return HEAP_Alloc (flags,size);
 }
 
 HANDLE GlobalFree (HANDLE hMem)
 {
-    return LocalFree (hMem);
+  return HEAP_Free (hMem);
 }
 
 LPVOID GlobalLock (HGLOBAL hMem)
 {
-    return LocalLock (hMem);
+  return hMem;
 }
 
 BOOL GlobalUnlock (HANDLE hMem)
 {
-    return LocalUnlock (hMem);
+  return 0;
 }
 
 WORD GlobalFlags (HANDLE hMem)
 {
-    return LocalFlags (hMem);
+  return LocalFlags (hMem);
 }
 
 DWORD GlobalSize (HANDLE hMem)
 {
-    return LocalSize (hMem);
-}
-
-DWORD GlobalCompact(DWORD desired)
-{
-    if (desired)
-	return desired;
-    else
-	return 0x01000000;	/* Should check the available core. */
+  return HEAP_Size (hMem);
 }
 
 HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
 {
-    if (!(flags & GMEM_MODIFY))
-      return LocalReAlloc (hMem, new_size, flags);
-    else
-      return hMem;
+  if (!(flags & GMEM_MODIFY))
+    return HEAP_ReAlloc (hMem, new_size, flags);
+  else
+    return hMem;
 }
 
 #endif
diff --git a/toolkit/hello3.c b/toolkit/hello3.c
index c688cec..90fadb1 100644
--- a/toolkit/hello3.c
+++ b/toolkit/hello3.c
@@ -1,5 +1,16 @@
 #include <windows.h>
 #include "hello3res.h"
+#include <commdlg.h>
+
+BOOL FileOpen(HWND hWnd)
+{
+  char filename[80] = "test.c";
+  OPENFILENAME ofn = { sizeof(OPENFILENAME),
+		       hWnd, NULL, "C code\0*.c\0", NULL, 0, 0, filename, 80,
+		       NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
+		       OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
+  return GetOpenFileName(&ofn);
+}
 
 BOOL CALLBACK DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
 {
@@ -37,6 +48,9 @@
 			ReleaseDC(wnd,hdc);
 			return 0;
 		}
+	        case 102:
+		        FileOpen(wnd);
+			return 0;
 		default:
 			return DefWindowProc (wnd, msg, w, l);
 	}
diff --git a/toolkit/hello3res.rc b/toolkit/hello3res.rc
index 23f29c5..5f5408c 100644
--- a/toolkit/hello3res.rc
+++ b/toolkit/hello3res.rc
@@ -3,6 +3,7 @@
  POPUP "Menu demo" {
    MENUITEM "Dialog Demo", 100
    MENUITEM "Bitmap Demo", 101
+   MENUITEM "Open...", 102
  }
 }
 
@@ -14,13 +15,10 @@
 	CONTROL "Pushbutton", 100, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 14, 92, 52, 13
 	CONTROL "Checkbox", 101, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 19, 76, 47, 12
 	CONTROL "Static text", 102, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 17, 60, 39, 10
-#if 0
-	/* Edit controls don't work, yet */
 	CONTROL "Edit control", 103, "EDIT", ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 18, 41, 44, 13
-#endif
 	CONTROL "Radio button", 104, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 17, 23, 58, 12
 	CONTROL "Checkbox", 101, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 19, 76, 47, 12
-#if 0
+#if 1
 	CONTROL "", 106, "COMBOBOX", CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 86, 23, 86, 85
 #else
 	CONTROL "", 106, "LISTBOX", LBS_STANDARD | LBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 86, 23, 86, 85
diff --git a/toolkit/libres.c b/toolkit/libres.c
new file mode 100644
index 0000000..c983ff6
--- /dev/null
+++ b/toolkit/libres.c
@@ -0,0 +1,106 @@
+/*
+ * WINElib-Resources
+ *
+ * Copied and modified heavily from loader/resource.c
+ */
+
+#include <stdio.h>
+#include "windows.h"
+
+struct resource /* This needs to coincide with what winerc generates. */
+{               /* It should really only appear in one place.         */
+  int id, type;
+  char *name;
+  unsigned char *bytes;
+  unsigned int size;
+};
+
+typedef struct RLE
+{
+  struct resource** Resources  /* NULL-terminated array of pointers */
+  struct RLE* next;
+} ResListE;
+
+static ResListE* ResourceList=NULL;
+
+void LIBRES_RegisterResources(struct resource** Res)
+{
+  ResListE** Curr;
+  ResListE* n;
+  for(Curr=&ResourceList; *Curr; Curr=&((*Curr)->next)) { }
+  n=malloc(sizeof(ResListE));
+  if(n)
+  {
+    n.Resources=Res;
+    n.next=NULL;
+    *Curr=n;
+  }
+  else
+    fprintf(stderr,"LIBRES_RegisterResources(): Out of memory.\n");
+}
+
+/**********************************************************************
+ *	    LIBRES_FindResource    
+ */
+HRSRC LIBRES_FindResource( HMODULE hModule, SEGPTR name, SEGPTR type )
+{
+  WINELIB_UNIMP("LIBRES_FindResource()");
+  return 0;
+}
+
+
+/**********************************************************************
+ *	    LIBRES_LoadResource    
+ */
+HGLOBAL LIBRES_LoadResource( HMODULE hModule, HRSRC hRsrc )
+{
+  return (HGLOBAL)(((struct resource*)hRsrc)->bytes);
+}
+
+
+/**********************************************************************
+ *	    LIBRES_LockResource    
+ */
+LPVOID LIBRES_LockResource( HMODULE hModule, HGLOBAL handle )
+{
+  return handle;
+}
+
+
+/**********************************************************************
+ *	    LIBRES_FreeResource    
+ */
+BOOL LIBRES_FreeResource( HMODULE hModule, HGLOBAL handle )
+{
+  return 0;
+}
+
+
+/**********************************************************************
+ *	    LIBRES_AccessResource    
+ */
+INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc )
+{
+  WINELIB_UNIMP("LIBRES_AccessResource()");
+  return -1;
+}
+
+
+/**********************************************************************
+ *	    LIBRES_SizeofResource    
+ */
+DWORD LIBRES_SizeofResource( HMODULE hModule, HRSRC hRsrc )
+{
+  return (HGLOBAL)(((struct resource*)hRsrc)->size);
+}
+
+
+/**********************************************************************
+ *	    LIBRES_AllocResource    
+ */
+HGLOBAL LIBRES_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
+{
+  WINELIB_UNIMP("LIBRES_AllocResource()");
+  return 0;
+}
+
diff --git a/toolkit/miscstubs.c b/toolkit/miscstubs.c
index ddeeb49..edab69e 100644
--- a/toolkit/miscstubs.c
+++ b/toolkit/miscstubs.c
@@ -48,43 +48,20 @@
   fprintf(stderr,"JBP: GlobalFreeAll() ignored.\n");
 }
 
-SEGPTR WIN16_GlobalLock(HGLOBAL h)
-{
-  return (SEGPTR)h;
-}
-
-
-HLOCAL LOCAL_Free( WORD ds, HLOCAL handle )
-{
-    return LocalFree(handle);
-}
-
-HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size )
-{
-    return LocalAlloc(flags,size);
-}
-
-HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
-{
-    return LocalReAlloc(handle,size,flags);
-}
-
+SEGPTR WIN16_GlobalLock(HGLOBAL h) 
+  { return (SEGPTR)h; }
+HLOCAL LOCAL_Free(WORD ds, HLOCAL handle) 
+  { return LocalFree(handle); }
+HLOCAL LOCAL_Alloc(WORD ds, WORD flags, WORD size)
+  { return LocalAlloc(flags,size); }
+HLOCAL LOCAL_ReAlloc(WORD ds, HLOCAL handle, WORD size, WORD flags)
+  { return LocalReAlloc(handle,size,flags); }
 NPVOID LOCAL_Lock( WORD ds, HLOCAL handle )
-{
-    return LocalLock(handle);
-}
-
+  { return LocalLock(handle); }
 BOOL LOCAL_Unlock( WORD ds, HLOCAL handle )
-{
-    fprintf(stderr,"JBP: LOCAL_Unlock() ignored.\n");
-    return 1;
-}
-
+  { return LocalUnlock(handle); }
 WORD LOCAL_Size( WORD ds, HLOCAL handle )
-{
-    fprintf(stderr,"JBP: LOCAL_Size() ignored.\n");
-    return 0;
-}
+  { return LocalSize(handle); }
 
 void FarSetOwner(HANDLE a, WORD b)
 {
diff --git a/tools/build.c b/tools/build.c
index 70ff43f..499f688 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -30,6 +30,7 @@
 #define TYPE_RETURN      8
 #define TYPE_STUB        9
 #define TYPE_STDCALL    10
+#define TYPE_CDECL	11
 
 #define MAX_ORDINALS	1299
 
@@ -83,6 +84,17 @@
 #define CONTEXTOFFSET(reg) \
    ((int)&(((struct sigcontext_struct *)1)->reg) - 1 \
     - sizeof(struct sigcontext_struct))
+#ifdef __svr4__
+#define sc_eax uc_mcontext.gregs[EAX]
+#define sc_ebx uc_mcontext.gregs[EBX]
+#define sc_ecx uc_mcontext.gregs[ECX]
+#define sc_edx uc_mcontext.gregs[EDX]
+#define sc_esi uc_mcontext.gregs[ESI]
+#define sc_edi uc_mcontext.gregs[EDI]
+#define sc_ds uc_mcontext.gregs[DS]
+#define sc_es uc_mcontext.gregs[ES]
+#define sc_eflags uc_mcontext.gregs[EFL]
+#endif
 
 static void *xmalloc (size_t size)
 {
@@ -313,6 +325,8 @@
             fdp->arg_types[i] = 'l';
 	else if (!strcmp(token, "ptr"))
             fdp->arg_types[i] = 'p';
+	else if (!strcmp(token, "..."))
+            fdp->arg_types[i] = '.';
 	else
 	{
 	    fprintf(stderr, "%d: Unknown variable type '%s'\n", Line, token);
@@ -436,6 +450,8 @@
         return ParseExportFunction(ordinal, TYPE_REGISTER);
     else if (strcmp(token, "stdcall") == 0)
         return ParseExportFunction(ordinal, TYPE_STDCALL);
+    else if (strcmp(token, "cdecl") == 0)
+        return ParseExportFunction(ordinal, TYPE_CDECL);
     else if (strcmp(token, "equate") == 0)
 	return ParseEquate(ordinal);
     else if (strcmp(token, "return") == 0)
@@ -732,6 +748,7 @@
     ORDFUNCDEF *fdp;
     ORDRETDEF *rdp;
     int i;
+    int varargs;
 
     SpecFp = fopen( specname, "r");
     if (SpecFp == NULL)
@@ -744,6 +761,7 @@
 
     printf( "/* File generated automatically, do not edit! */\n" );
     printf( "#include <sys/types.h>\n");
+    printf( "#include <stdarg.h>\n");
     printf( "#include \"windows.h\"\n");
     printf( "#include \"dlls.h\"\n");
     printf( "#include \"pe_image.h\"\n");
@@ -768,48 +786,56 @@
             printf( "\t/*NOTREACHED*/\n\treturn 0;\n}\n\n");
             break;
         case TYPE_STDCALL:
+        case TYPE_CDECL:
+	    varargs=0;
             argc=strlen(fdp->arg_types);
-            printf( "void %s_%d(", UpperDLLName, i);
+	    printf( "void %s_%d(", UpperDLLName, i);
             for(argno=0;argno<argc;argno++)
             {
                 switch(fdp->arg_types[argno])
                 {
                 case 'p': printf( "void *");break;
                 case 'l': printf( "int ");break;
+                case '.': printf( "... ");varargs=argno;break;
                 default:
                     fprintf(stderr, "Not supported argument type %c\n",
                             fdp->arg_types[argno]);
                     exit(1);
                 }
-                putchar( 'a'+argno );
+                if(fdp->arg_types[argno]!='.') putchar( 'a'+argno );
                 if (argno!=argc-1) putchar( ',' );
             }
-            printf( ")\n{\n" );
+            printf( ")" );
+	    if(odp->type == TYPE_STDCALL) printf(" /*__attribute__ ((stdcall))*/");
+            printf( "\n{\n" );
+	    if (varargs) printf( "\tva_list valist;\n\n\tva_start(valist, %c);",
+	    			 'a'+varargs-1 );
             printf( "\tdprintf_relay(stddeb,\"Call %%s.%%s(");
             for (argno=0;argno<argc;argno++)
-            {
+              if(fdp->arg_types[argno]!='.')
+              {
                 putchar( '%' );
                 putchar( (fdp->arg_types[argno] == 'p') ? 'p' : 'x' );
                 if (argno < argc-1) putchar( ',' );
-            }
+              }
             printf( ")\\n\", \"%s\", \"%s\"", UpperDLLName, odp->export_name);
-            for(argno=0;argno<argc;argno++) printf( ",%c", 'a'+argno);
+            for(argno=0;argno<argc;argno++) 
+	        if(fdp->arg_types[argno]!='.') printf( ",%c", 'a'+argno);
             printf( ");\n\t%s(", fdp->internal_name );
             for(argno=0;argno<argc;argno++)
             {
-                putchar('a'+argno);
+                if (fdp->arg_types[argno]=='.') printf("valist");
+		else putchar('a'+argno);
                 if (argno!=argc-1) putchar(',');
             }
-            printf( ");\n\t__asm__ __volatile__(\"movl %%ebp,%%esp;"
-                    "popl %%ebp;ret $%d\");\n}\n\n",
-                    4*argc);
+            printf( ");\n}\n\n");
             break;
         case TYPE_RETURN:
             printf( "void %s_%d()\n{\n\t", UpperDLLName, i);
             printf( "RELAY32_DebugEnter(\"%s\",\"%s\");\n\t",
                    UpperDLLName, odp->export_name);
             printf( "WIN32_LastError=ERROR_CALL_NOT_IMPLEMENTED;\n");
-            printf( "\t__asm__ __volatile__ (\"movl %d,%%eax\");\n", 
+            printf( "\t__asm__ __volatile__ (\"movl $%d,%%eax\");\n", 
                    rdp->ret_value);
             printf( "\t__asm__ __volatile__ (\"movl %%ebp,%%esp;popl %%ebp;"
                     "ret $%d\");\n}\n\n", rdp->arg_size);
@@ -836,6 +862,7 @@
             break;
         case TYPE_RETURN:
         case TYPE_STDCALL:
+        case TYPE_CDECL:
         case TYPE_STUB:
             printf( "{\"%s\",%s_%d},\n", odp->export_name, UpperDLLName, i);
             break;
diff --git a/win32/Makefile.in b/win32/Makefile.in
index bfabcb6..3980b9e 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -2,12 +2,16 @@
 MODULE = win32
 
 C_SRCS = \
+	advapi.c \
 	code_page.c \
+	console.c \
 	environment.c \
 	error.c \
 	file.c \
 	init.c \
 	memory.c \
+	object_mgt.c \
+	process.c \
 	thread.c \
 	time.c
 
diff --git a/win32/advapi.c b/win32/advapi.c
new file mode 100644
index 0000000..be633d8
--- /dev/null
+++ b/win32/advapi.c
@@ -0,0 +1,34 @@
+/*
+ * Win32 advapi functions
+ *
+ * Copyright 1995 Martin von Loewis
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+/*#include "kernel32.h"*/
+#include "stddebug.h"
+#include "debug.h"
+
+/***********************************************************************
+ *           GetUserNameA   (ADVAPI32.67)
+ */
+
+int GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
+{
+  size_t len;
+  char *name;
+
+  name=getlogin();
+  len = name ? strlen(name) : 0;
+  if (!len || !lpSize || len > *lpSize) {
+    if (lpszName) *lpszName = 0;
+    return 0;
+  }
+  *lpSize=len;
+  strcpy(lpszName, name);
+  return 1;
+}
+
diff --git a/win32/code_page.c b/win32/code_page.c
index 1338ea4..1ec9953 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -8,6 +8,9 @@
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
+
 
 /***********************************************************************
  *           GetACP               (KERNEL32.148)
@@ -36,3 +39,11 @@
     return 437;    /* MS-DOS United States */
 }
 
+/***********************************************************************
+ *              MultiByteToWideChar                (KERNEL32.392)
+ */
+int MultiByteToWideChar(UINT page, DWORD flags, char *src, int srclen,
+                        WCHAR *dst, int dstlen)
+{
+    return (srclen==-1) ? strlen(src) * 2: srclen*2; 
+}
diff --git a/win32/console.c b/win32/console.c
new file mode 100644
index 0000000..48215cf
--- /dev/null
+++ b/win32/console.c
@@ -0,0 +1,22 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <stdio.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+#include "wincon.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/***********************************************************************
+ *           SetConsoleCtrlHandler               (KERNEL32.459)
+ */
+BOOL SetConsoleCtrlHandler(HANDLER_ROUTINE * func,  BOOL a)
+{
+	return 0;
+}
+
diff --git a/win32/environment.c b/win32/environment.c
index a37c57f..17e2966 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -10,6 +10,8 @@
 #include "winerror.h"
 #include "kernel32.h"
 #include "task.h"
+#include "stddebug.h"
+#include "debug.h"
 
 
 /***********************************************************************
@@ -20,7 +22,7 @@
     static char buffer[256];
     PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() );
     memcpy( buffer, &pdb->cmdLine[1], pdb->cmdLine[0] );
-    printf("CommandLine = %s\n", buffer );
+    dprintf_win32(stddeb,"CommandLine = %s\n", buffer );
     return buffer;
 }
 
diff --git a/win32/error.c b/win32/error.c
index 5bbe1f8..7204884 100644
--- a/win32/error.c
+++ b/win32/error.c
@@ -8,6 +8,8 @@
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
 
 static int WIN32_LastError;
 
diff --git a/win32/file.c b/win32/file.c
index 160fc40..a914e23 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -7,9 +7,48 @@
 #include <errno.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
+#include "handle32.h"
+#include "dos_fs.h"
+#include "stddebug.h"
+#define DEBUG_WIN32
+#include "debug.h"
+
+
+extern FILE_OBJECT *hstdin;
+extern FILE_OBJECT *hstdout;
+extern FILE_OBJECT *hstderr;
+
+static int TranslateCreationFlags(DWORD create_flags);
+static int TranslateAccessFlags(DWORD access_flags);
+
+/***********************************************************************
+ *           GetFileInformationByHandle       (KERNEL32.219)
+ *
+ */
+HANDLE WINAPI  CreateFileA(const char * filename, DWORD a, DWORD b, void * c,
+                           DWORD d, DWORD e, DWORD f)
+{
+   dprintf_win32(stderr, "CreateFileA: %s\n", filename);
+   return -1;
+}
+
+/***********************************************************************
+ *           GetFileInformationByHandle       (KERNEL32.219)
+ *
+ */
+DWORD WINAPI GetFileInformationByHandle(HANDLE hFile, 
+                                        BY_HANDLE_FILE_INFORMATION *lpfi)
+{
+    memset(lpfi, 0, sizeof(BY_HANDLE_FILE_INFORMATION));
+    return 1;
+}
 
 /***********************************************************************
  *           GetFileType              (KERNEL32.222)
@@ -17,34 +56,50 @@
  * GetFileType currently only supports stdin, stdout, and stderr, which
  * are considered to be of type FILE_TYPE_CHAR.
  */
-DWORD GetFileType(HANDLE hFile)
+DWORD GetFileType(FILE_OBJECT *hFile)
 {
-    DWORD file_type;
-
-    if((DWORD)hFile < 3)
+    if(ValidateKernelObject((HANDLE32)hFile) != 0)
     {
-        file_type = 2;        /* FILE_TYPE_CHAR */
+        SetLastError(ERROR_UNKNOWN);
+        return FILE_TYPE_UNKNOWN;
     }
-    else
+    if(hFile->common.magic != KERNEL_OBJECT_FILE)
     {
-        file_type = 0;        /* FILE_TYPE_UNKNOWN */
+        SetLastError(ERROR_UNKNOWN);
+        return FILE_TYPE_UNKNOWN;
     }
 
-    return file_type;
+    return hFile->type;
 }
 
 /***********************************************************************
  *           GetStdHandle             (KERNEL32.276)
  */
-HANDLE GetStdHandle(DWORD nStdHandle)
+HANDLE32 GetStdHandle(DWORD nStdHandle)
 {
-        switch(nStdHandle)
-        {
-                case -10/*STD_INPUT_HANDLE*/:return (HANDLE)0;
-                case -11/*STD_OUTPUT_HANDLE*/:return (HANDLE)1;
-                case -12/*STD_ERROR_HANDLE*/:return (HANDLE)2;
-        }
-        return (HANDLE)-1;
+    HANDLE32 rc;
+
+    switch(nStdHandle)
+    {
+        case STD_INPUT_HANDLE:
+            rc = (HANDLE32)hstdin;
+            break;
+
+        case STD_OUTPUT_HANDLE:
+            rc = (HANDLE32)hstdout;
+            break;
+
+        case STD_ERROR_HANDLE:
+            rc = (HANDLE32)hstderr;
+            break;
+
+        default:
+            rc = INVALID_HANDLE_VALUE;
+            SetLastError(ERROR_UNKNOWN);
+            break;
+    }
+
+    return rc;
 }
 
 /***********************************************************************
@@ -53,21 +108,32 @@
  * Luckily enough, this function maps almost directly into an lseek
  * call, the exception being the use of 64-bit offsets.
  */
-DWORD SetFilePointer(HANDLE hFile, LONG distance, LONG *highword,
+DWORD SetFilePointer(FILE_OBJECT *hFile, LONG distance, LONG *highword,
                      DWORD method)
 {
     int rc;
 
+    if(ValidateKernelObject((HANDLE32)hFile) != 0)
+    {
+        SetLastError(ERROR_UNKNOWN);
+        return ((DWORD)0xFFFFFFFF);
+    }
+    if(hFile->common.magic != KERNEL_OBJECT_FILE)
+    {
+        SetLastError(ERROR_UNKNOWN);
+        return ((DWORD)0xFFFFFFFF);
+    }
+
     if(highword != NULL)
     {
         if(*highword != 0)
         {
-            printf("SetFilePointer: 64-bit offsets not yet supported.\n");
+            dprintf_win32(stddeb, "SetFilePointer: 64-bit offsets not yet supported.\n");
             return -1;
         }
     }
 
-    rc = lseek((DWORD)hFile, distance, method);
+    rc = lseek(hFile->fd, distance, method);
     if(rc == -1)
         SetLastError(ErrnoToLastError(errno));
     return rc;
@@ -75,22 +141,203 @@
 
 /***********************************************************************
  *             WriteFile               (KERNEL32.578)
- *
- * WriteFile isn't very useful at this point since only standard
- * handles are permitted, but it lets us see runtime errors at least.
  */
-BOOL WriteFile(HANDLE hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
-              LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
+BOOL WriteFile(FILE_OBJECT *hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
+               LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
 {
     int written;
 
-    if((DWORD)hFile < 3)
+    if(ValidateKernelObject((HANDLE32)hFile) != 0)
     {
-        written = write((DWORD)hFile, lpBuffer, numberOfBytesToWrite);
-        if(numberOfBytesWritten)
-            *numberOfBytesWritten = written;
+        SetLastError(ERROR_UNKNOWN);
+        return 0;
     }
+    if(hFile->common.magic != KERNEL_OBJECT_FILE)
+    {
+        SetLastError(ERROR_UNKNOWN);
+        return 0;
+    }
+
+    written = write(hFile->fd, lpBuffer, numberOfBytesToWrite);
+    if(numberOfBytesWritten)
+        *numberOfBytesWritten = written;
 
     return 1;
 }
 
+/***********************************************************************
+ *              ReadFile                (KERNEL32.428)
+ */
+BOOL ReadFile(FILE_OBJECT *hFile, LPVOID lpBuffer, DWORD numtoread,
+              LPDWORD numread, LPOVERLAPPED lpOverlapped)
+{
+    int actual_read;
+
+    if(ValidateKernelObject((HANDLE32)hFile) != 0)
+    {
+        SetLastError(ERROR_UNKNOWN);
+        return 0;
+    }
+    if(hFile->common.magic != KERNEL_OBJECT_FILE)
+    {
+        SetLastError(ERROR_UNKNOWN);
+        return 0;
+    }
+
+    actual_read = read(hFile->fd, lpBuffer, numtoread);
+    if(actual_read == -1)
+    {
+        SetLastError(ErrnoToLastError(errno));
+        return 0;
+    }
+    if(numread)
+        *numread = actual_read;
+
+    return 1;
+}
+
+/*************************************************************************
+ *              CreateFile              (KERNEL32.45)
+ *
+ * Doesn't support character devices or pipes yet.
+ */
+HANDLE32 CreateFile(LPSTR filename, DWORD access, DWORD sharing,
+                    LPSECURITY_ATTRIBUTES security, DWORD creation,
+                    DWORD attributes, HANDLE32 template)
+{
+    int access_flags, create_flags;
+    int fd;
+    FILE_OBJECT *file_obj;
+    int type;
+
+    /* Translate the various flags to Unix-style.
+     */
+    access_flags = TranslateAccessFlags(access);
+    create_flags = TranslateCreationFlags(creation);
+
+    if(template)
+        printf("CreateFile: template handles not supported.\n");
+
+    /* If the name starts with '\\?' or '\\.', ignore the first 3 chars.
+     */
+    if(!strncmp(filename, "\\\\?", 3) || !strncmp(filename, "\\\\.", 3))
+        filename += 3;
+
+    /* If the name still starts with '\\', it's a UNC name.
+     */
+    if(!strncmp(filename, "\\\\", 2))
+    {
+        printf("CreateFile: UNC names not supported.\n");
+        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+        return INVALID_HANDLE_VALUE;
+    }
+
+    /* If the name is either CONIN$ or CONOUT$, give them stdin
+     * or stdout, respectively.
+     */
+    if(!strcmp(filename, "CONIN$"))
+    {
+        type = FILE_TYPE_CHAR;
+        fd = 0;
+    }
+    else if(!strcmp(filename, "CONOUT$"))
+    {
+        type = FILE_TYPE_CHAR;
+        fd = 1;
+    }
+    else
+    {
+        type = FILE_TYPE_DISK;
+
+        /* Try to open the file.
+         */
+        fd = open(DOS_GetUnixFileName(filename),
+                  access_flags | create_flags, 0666);
+        if(fd == -1)
+        {
+            SetLastError(ErrnoToLastError(errno));
+            return INVALID_HANDLE_VALUE;
+        }
+    }
+
+    /* We seem to have succeeded, so allocate a kernel object
+     * and set it up.
+     */
+    file_obj = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
+    if(file_obj == NULL)
+    {
+        SetLastError(ERROR_UNKNOWN);
+        return INVALID_HANDLE_VALUE;
+    }
+    file_obj->common.magic = KERNEL_OBJECT_FILE;
+    file_obj->fd = fd;
+    file_obj->type = type;
+    file_obj->misc_flags = attributes;
+    file_obj->access_flags = access_flags;
+    file_obj->create_flags = create_flags;
+
+    return (HANDLE32)file_obj;
+}
+
+int CloseFileHandle(FILE_OBJECT *hFile)
+{
+    /* If it's one of the 3 standard handles, don't really
+     * close it.
+     */
+    if(hFile->fd > 2)
+        close(hFile->fd);
+
+    return 1;
+}
+
+static int TranslateAccessFlags(DWORD access_flags)
+{
+    int rc = 0;
+
+    switch(access_flags)
+    {
+        case GENERIC_READ:
+            rc = O_RDONLY;
+            break;
+
+        case GENERIC_WRITE:
+            rc = O_WRONLY;
+            break;
+
+        case (GENERIC_READ | GENERIC_WRITE):
+            rc = O_RDWR;
+            break;
+    }
+
+    return rc;
+}
+
+static int TranslateCreationFlags(DWORD create_flags)
+{
+    int rc = 0;
+
+    switch(create_flags)
+    {
+        case CREATE_NEW:
+            rc = O_CREAT | O_EXCL;
+            break;
+
+        case CREATE_ALWAYS:
+            rc = O_CREAT | O_TRUNC;
+            break;
+
+        case OPEN_EXISTING:
+            rc = 0;
+            break;
+
+        case OPEN_ALWAYS:
+            rc = O_CREAT;
+            break;
+
+        case TRUNCATE_EXISTING:
+            rc = O_TRUNC;
+            break;
+    }
+
+    return rc;
+}
diff --git a/win32/init.c b/win32/init.c
index 0554a2f..b4d3f0d 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -10,9 +10,53 @@
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
-
+#include "handle32.h"
+#include "stddebug.h"
+#include "debug.h"
+  
+/* The global error value
+ */
 int WIN32_LastError;
 
+/* Standard system handles for stdin, stdout, and stderr.
+ */
+FILE_OBJECT *hstdin, *hstdout, *hstderr;
+
+static int CreateStdHandles(void);
+
+/*********************************************************************
+ *              CloseHandle             (KERNEL32.23)
+ */
+BOOL CloseHandle(HANDLE32 handle)
+{
+    int rc;
+
+    if(ValidateKernelObject(handle) != 0)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return 0;
+    }
+
+    switch(handle->magic)
+    {
+        case KERNEL_OBJECT_UNUSED:
+            SetLastError(ERROR_INVALID_HANDLE);
+            return 0;
+
+        case KERNEL_OBJECT_FILE:
+            rc = CloseFileHandle((FILE_OBJECT *)handle);
+            break;
+
+        default:
+            printf("CloseHandle: type %ld not implemented yet.\n",
+                   handle->magic);
+            break;
+    }
+
+    ReleaseKernelObject(handle);
+    return 0;
+}
+
 /***********************************************************************
  *              GetModuleFileNameA      (KERNEL32.235)
  */
@@ -23,6 +67,17 @@
 }
 
 /***********************************************************************
+ *              GetModuleHandle         (KERNEL32.237)
+ */
+HMODULE WIN32_GetModuleHandle(char *module)
+{
+    if(module == NULL)
+        return (HMODULE)0;
+    else
+        return GetModuleHandle(module);
+}
+
+/***********************************************************************
  *              GetStartupInfoA         (KERNEL32.273)
  */
 VOID GetStartupInfoA(LPSTARTUPINFO lpStartupInfo)
@@ -38,7 +93,59 @@
     lpStartupInfo->hStdError  = (HANDLE)2;
 }
 
+/* Initialize whatever internal data structures we need.
+ *
+ * Returns 1 on success, 0 on failure.
+ */
 int KERN32_Init(void)
 {
+    /* Create the standard system handles
+     */
+    if(CreateStdHandles() != 0)
+        return 0;
+
     return 1;
 }
+
+/* CreateStdHandles creates the standard input, output, and error handles.
+ * These handles aren't likely to be used since they're generally used for
+ * console output, but startup code still likes to mess with them.  They're
+ * also useful for debugging since apps and runtime libraries might write
+ * errors to stderr.
+ *
+ * Returns 0 on success, nonzero on failure.
+ */
+static int CreateStdHandles(void)
+{
+    /* Create the standard input handle.
+     */
+    hstdin = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
+    if(hstdin == NULL)
+        return 1;
+    hstdin->common.magic = KERNEL_OBJECT_FILE;
+    hstdin->fd = 0;
+    hstdin->type = FILE_TYPE_CHAR;
+    hstdin->misc_flags = 0;
+
+    /* Create the standard output handle
+     */
+    hstdout = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
+    if(hstdout == NULL)
+        return 1;
+    hstdout->common.magic = KERNEL_OBJECT_FILE;
+    hstdout->fd = 1;
+    hstdout->type = FILE_TYPE_CHAR;
+    hstdout->misc_flags = 0;
+
+    /* Create the standard error handle
+     */
+    hstderr = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
+    if(hstderr == NULL)
+        return 1;
+    hstderr->common.magic = KERNEL_OBJECT_FILE;
+    hstderr->fd = 2;
+    hstderr->type = FILE_TYPE_CHAR;
+    hstderr->misc_flags = 0;
+
+    return 0;
+}
diff --git a/win32/memory.c b/win32/memory.c
index a654510..2ee8eb5 100644
--- a/win32/memory.c
+++ b/win32/memory.c
@@ -9,9 +9,22 @@
 #include <string.h>
 #include <sys/time.h>
 #include <unistd.h>
+#include <sys/mman.h>
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
+#include "winbase.h"
+#include "stddebug.h"
+#include "debug.h"
+
+typedef struct {
+    caddr_t	ptr;
+    long	size;
+} virtual_mem_t;
+
+virtual_mem_t *mem = 0;
+int mem_count = 0;
+int mem_used = 0;
 
 /***********************************************************************
  *           VirtualAlloc             (KERNEL32.548)
@@ -19,9 +32,79 @@
 LPVOID VirtualAlloc(LPVOID lpvAddress, DWORD cbSize,
                    DWORD fdwAllocationType, DWORD fdwProtect)
 {
-    char *ptr;
+    caddr_t	ptr;
+    int	i;
+    virtual_mem_t *tmp_mem;
+    int	prot;
 
-    printf("VirtualAlloc: size = %ld, address=%p\n", cbSize, lpvAddress);
+    dprintf_win32(stddeb, "VirtualAlloc: size = %ld, address=%p\n", cbSize, lpvAddress);
+    if (fdwAllocationType & MEM_RESERVE || !lpvAddress) {
+        ptr = mmap((void *)((((unsigned long)lpvAddress-1) & 0xFFFF0000L) 
+	                + 0x00010000L),
+		   cbSize, PROT_NONE, MAP_ANON|MAP_PRIVATE,0,0);
+        if (lpvAddress && ((unsigned long)ptr & 0xFFFF0000L)) {
+	    munmap(ptr, cbSize);
+	    cbSize += 65535;
+	    ptr =  mmap(lpvAddress, cbSize, 
+	                PROT_NONE, MAP_ANON|MAP_PRIVATE,0,0);
+	    ptr = (void *)((((unsigned long)ptr-1) & 0xFFFF0000L)+0x00010000L);
+	}
+	/* remember the size for VirtualFree since it's going to be handed
+	   a zero len */
+	if (ptr) {
+	    if (mem_count == mem_used) {
+	        tmp_mem = realloc(mem,(mem_count+10)*sizeof(virtual_mem_t));
+		if (!tmp_mem) return 0;
+		mem = tmp_mem;
+		memset(mem+mem_count, 0, 10*sizeof(virtual_mem_t));
+		mem_count += 10;
+	    }
+	    for (i=0; i<mem_count; i++) {
+	        if (!(mem+i)->ptr) {
+		    (mem+i)->ptr = ptr;
+		    (mem+i)->size = cbSize;
+		    mem_used++;
+		    break;
+		}
+	    }
+	}
+    } else {
+        ptr = lpvAddress;
+    }
+    if (fdwAllocationType & MEM_COMMIT) {
+        switch(fdwProtect & ~(PAGE_GUARD | PAGE_NOCACHE)) {
+	    case PAGE_READONLY:
+	        prot=PROT_READ;
+		break;
+	    case PAGE_READWRITE:
+	        prot=PROT_READ|PROT_WRITE;
+		break;
+	    case PAGE_WRITECOPY:
+	        prot=PROT_WRITE;
+		break;
+	    case PAGE_EXECUTE:
+	        prot=PROT_EXEC;
+		break;
+	    case PAGE_EXECUTE_READ:
+	        prot=PROT_EXEC|PROT_READ;
+		break;
+	    case PAGE_EXECUTE_READWRITE:
+	        prot=PROT_EXEC|PROT_READ|PROT_WRITE;
+		break;
+	    case PAGE_EXECUTE_WRITECOPY:
+	        prot=PROT_EXEC|PROT_WRITE;
+		break;
+	    case PAGE_NOACCESS:
+	    default:
+	        prot=PROT_NONE;
+		break;
+	}
+	mprotect(ptr, cbSize, prot);
+    }
+    return ptr;
+#if 0
+/* kludge for gnu-win32 */
+    if (fdwAllocationType & MEM_RESERVE) return sbrk(0);
     ptr = malloc(cbSize + 65536);
     if(ptr)
     {
@@ -30,7 +113,8 @@
         ptr = (void *)(((unsigned long)ptr & 0xFFFF0000L) + 0x00010000L);
         memset(ptr, 0, cbSize);
     }
-    printf("VirtualAlloc: got pointer %p\n", ptr);
+#endif
+    dprintf_win32(stddeb, "VirtualAlloc: got pointer %p\n", ptr);
     return ptr;
 }
 
@@ -39,8 +123,24 @@
  */
 BOOL VirtualFree(LPVOID lpvAddress, DWORD cbSize, DWORD fdwFreeType)
 {
+    int i;
+
+    if (fdwFreeType & MEM_RELEASE) {
+        for (i=0; i<mem_count; i++) {
+            if ((mem+i)->ptr == lpvAddress) {
+    	         munmap(lpvAddress, (mem+i)->size);
+    	         (mem+i)->ptr = 0;
+    	         mem_used--;
+    	         break;
+	    }
+    	}
+    } else {
+        mprotect(lpvAddress, cbSize, PROT_NONE);
+    }
+#if 0
     if(lpvAddress)
         free(lpvAddress);
+#endif
     return 1;
 }
 
diff --git a/win32/object_mgt.c b/win32/object_mgt.c
new file mode 100644
index 0000000..668a13a
--- /dev/null
+++ b/win32/object_mgt.c
@@ -0,0 +1,19 @@
+/*
+ *      object_mgt.c - Kernel object management functions
+ *
+ *  Revision History:
+ *
+ *  Oct 28 1995 C. Heide
+ *              First created.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "handle32.h"
+
+int ValidateKernelObject(KERNEL_OBJECT *ptr)
+{
+    return 0;
+}
+
diff --git a/win32/process.c b/win32/process.c
new file mode 100644
index 0000000..3773dbb
--- /dev/null
+++ b/win32/process.c
@@ -0,0 +1,23 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/***********************************************************************
+ *           ExitProcess   (KERNEL32.100)
+ */
+
+void ExitProcess(DWORD status)
+{
+        exit(status);
+}
+
diff --git a/win32/thread.c b/win32/thread.c
index e6b9e2c..ec77af5 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -9,6 +9,8 @@
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
 
 /***********************************************************************
  *           GetCurrentThreadId   (KERNEL32.200)
diff --git a/win32/time.c b/win32/time.c
index 58f9703..29b20ba 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -10,6 +10,8 @@
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
+#include "stddebug.h"
+#include "debug.h"
 
 /***********************************************************************
  *              GetTimeZoneInformation  (KERNEL32.302)
diff --git a/windows/defwnd.c b/windows/defwnd.c
index eda4fe2..786c0a7 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -2,6 +2,7 @@
  * Default window procedure
  *
  * Copyright 1993 Alexandre Julliard
+ *	     1995 Alex Korobka
  */
 
 #include <stdlib.h>
@@ -20,6 +21,8 @@
   /* Last COLOR id */
 #define COLOR_MAX   COLOR_BTNHIGHLIGHT
 
+static short iMenuKey = 0;
+static short iMenuSysKey = 0;
 
 /***********************************************************************
  *           DEFWND_SetText
@@ -244,16 +247,95 @@
             return NC_HandleSysCommand( hwnd, wParam, pt );
         }
 
+    case WM_KEYDOWN:
+
+	if(wParam == VK_F10) iMenuKey = VK_F10;
+	break;
+
     case WM_SYSKEYDOWN:
+	/* this breaks current pseudo accelerators but
+	   creates a basis for implementing real ones */
+
+	if(wParam == VK_F10) 
+	   {
+	    iMenuKey = VK_F10;
+	    break;
+	   }
+	
 	if (wParam == VK_MENU)
-	{   /* Send to WS_OVERLAPPED parent. TODO: Handle MDI */
-	    SendMessage( WIN_GetTopParent(hwnd), WM_SYSCOMMAND,
-                         SC_KEYMENU, 0L );
+	   {  
+	    iMenuSysKey = (iMenuSysKey)? 0: 1;
+	    iMenuKey    = 0;
 	}
 	break;
 
+    case WM_KEYUP:
     case WM_SYSKEYUP:
+
+	if( (wParam == VK_MENU && iMenuSysKey) || 
+	    (wParam == VK_F10 && iMenuKey) )
+
+	      /* Send to WS_OVERLAPPED parent. TODO: Handle MDI */
+	      SendMessage( WIN_GetTopParent(hwnd), WM_SYSCOMMAND,
+			   SC_KEYMENU, 0L );
+
+	iMenuSysKey = 0;
+	iMenuKey = 0;
         break;
+
+    case WM_SHOWWINDOW:
+	if( !lParam ) return 0; /* sent from ShowWindow */
+
+	if( !(wndPtr->dwStyle & WS_POPUP) || !wndPtr->hwndOwner ) 
+	      return 0;
+
+	if( wndPtr->dwStyle & WS_VISIBLE )
+	    { if( wParam ) return 0; }
+	else
+	      if(!wParam ) return 0;
+  
+	ShowWindow(hwnd,(wParam)? SW_SHOWNOACTIVATE: SW_HIDE);
+	break; 
+
+    case WM_CANCELMODE:
+
+	/* EndMenu() should be called if in menu state but currently it's
+	   impossible to detect - menu code should be updated*/
+
+	if( GetCapture() == hwnd )
+	    ReleaseCapture();
+
+	break;
+
+    case WM_VKEYTOITEM:
+    case WM_CHARTOITEM:
+	return -1;
+
+    case WM_DROPOBJECT:
+	return DRAG_FILE;  
+
+    case WM_QUERYDROPOBJECT:
+	if(wndPtr->dwExStyle & WS_EX_ACCEPTFILES)
+	   return 1;
+	break;
+
+    case WM_QUERYDRAGICON:
+	{
+	 HICON hI = 0;
+
+	 len = 1;
+	 while(len < 64)
+		if( (hI = LoadIcon(wndPtr->hInstance,MAKEINTRESOURCE(len))) )
+		     return hI;
+	}
+        break;
+
+    case WM_QUERYOPEN:
+    case WM_QUERYENDSESSION:
+	return 1;
+
     }
     return 0;
 }
+
+
diff --git a/windows/dialog.c b/windows/dialog.c
index 6a16805..8f7cdb0 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -411,7 +411,7 @@
                                       header->y * yUnit / 8,
                                       header->cx * xUnit / 4,
                                       header->cy * yUnit / 8,
-                                      hwnd, (HMENU)header->id,
+                                      hwnd, (HMENU)((DWORD)header->id),
                                       dlgInfo->hDialogHeap, (SEGPTR)0 );
 	}
 	else
@@ -422,7 +422,7 @@
                                       header->y * yUnit / 8,
                                       header->cx * xUnit / 4,
                                       header->cy * yUnit / 8,
-                                      hwnd, (HMENU)header->id,
+                                      hwnd, (HMENU)((DWORD)header->id),
                                       hInst, (SEGPTR)0 );
 	}
 
diff --git a/windows/hook.c b/windows/hook.c
index d56c93f..2460cad 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -1,24 +1,215 @@
 /*
  * Windows hook functions
  *
- * Copyright 1994 Alexandre Julliard
+ * Copyright 1994, 1995 Alexandre Julliard
+ *
+ * Based on investigations by Alex Korobka
  */
 
-/* Warning!
- * HHOOK is not a real handle, but a 32-bit pointer to a HOOKDATA structure.
- * This is for compatibility with Windows 3.0 where HHOOK was a HOOKPROC.
+/*
+ * Warning!
+ * A HHOOK is a 32-bit handle for compatibility with Windows 3.0 where it was
+ * a pointer to the next function. Now it is in fact composed of a USER heap
+ * handle in the low 16 bits and of a HOOK_MAGIC value in the high 16 bits
+ * (except for WINELIB32 where it is a 32-bit handle).  -- AJ
  */
 
 #include "hook.h"
+#include "message.h"
 #include "user.h"
 #include "stddebug.h"
 #include "debug.h"
 
-HHOOK systemHooks[LAST_HOOK-FIRST_HOOK+1] = { 0, };
+  /* This should probably reside in USER heap */
+static HANDLE HOOK_systemHooks[WH_NB_HOOKS] = { 0, };
 
-  /* Task-specific hooks should probably be in the task structure */
-HHOOK taskHooks[LAST_HOOK-FIRST_HOOK+1] = { 0, };
 
+/***********************************************************************
+ *           HOOK_GetNextHook
+ *
+ * Get the next hook of a given hook.
+ */
+static HANDLE HOOK_GetNextHook( HANDLE hook )
+{
+    HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR( hook );
+    if (!data) return 0;
+    if (data->next) return data->next;
+    if (!data->ownerQueue) return 0;  /* Already system hook */
+    /* Now start enumerating the system hooks */
+    return HOOK_systemHooks[data->id - WH_FIRST_HOOK];
+}
+
+
+/***********************************************************************
+ *           HOOK_GetHook
+ *
+ * Get the first hook for a given type.
+ */
+static HANDLE HOOK_GetHook( short id )
+{
+    MESSAGEQUEUE *queue;
+    HANDLE hook = 0;
+
+    if ((queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) )) != NULL)
+        hook = queue->hooks[id - WH_FIRST_HOOK];
+    if (!hook) hook = HOOK_systemHooks[id - WH_FIRST_HOOK];
+    return hook;
+}
+
+
+/***********************************************************************
+ *           HOOK_SetHook
+ *
+ * Install a given hook.
+ */
+HANDLE HOOK_SetHook( short id, HOOKPROC proc, HINSTANCE hInst, HTASK hTask )
+{
+    HOOKDATA *data;
+    HANDLE handle;
+    HQUEUE hQueue = 0;
+
+    if ((id < WH_FIRST_HOOK) || (id > WH_LAST_HOOK)) return 0;
+    if (!(hInst = GetExePtr( hInst ))) return 0;
+
+    dprintf_hook( stddeb, "Setting hook %d: %08lx "NPFMT" "NPFMT"\n",
+                  id, (DWORD)proc, hInst, hTask );
+
+    if (hTask)  /* Task-specific hook */
+    {
+	if ((id == WH_JOURNALRECORD) || (id == WH_JOURNALPLAYBACK) ||
+	    (id == WH_SYSMSGFILTER)) return 0;  /* System-only hooks */
+        if (!(hQueue = GetTaskQueue( hTask ))) return 0;
+    }
+
+    if (id == WH_JOURNALPLAYBACK || id == WH_CBT ||
+        id == WH_DEBUG || id == WH_SHELL)
+    {
+	fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,"NPFMT","NPFMT")!\n",
+                 id, (DWORD)proc, hInst, hTask );
+    }
+
+    /* Create the hook structure */
+
+    if (!(handle = (HANDLE)USER_HEAP_ALLOC( sizeof(HOOKDATA) ))) return 0;
+    data = (HOOKDATA *) USER_HEAP_LIN_ADDR( handle );
+    data->proc        = proc;
+    data->id          = id;
+    data->ownerQueue  = hQueue;
+    data->ownerModule = hInst;
+    data->inHookProc  = 0;
+    dprintf_hook( stddeb, "Setting hook %d: ret="NPFMT"\n", id, handle );
+
+    /* Insert it in the correct linked list */
+
+    if (hQueue)
+    {
+        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( hQueue );
+        data->next = queue->hooks[id - WH_FIRST_HOOK];
+        queue->hooks[id - WH_FIRST_HOOK] = handle;
+    }
+    else
+    {
+        data->next = HOOK_systemHooks[id - WH_FIRST_HOOK];
+        HOOK_systemHooks[id - WH_FIRST_HOOK] = handle;
+    }
+    return handle;
+}
+
+
+/***********************************************************************
+ *           HOOK_RemoveHook
+ *
+ * Remove a hook from the list.
+ */
+static BOOL HOOK_RemoveHook( HANDLE hook )
+{
+    HOOKDATA *data;
+    HANDLE *prevHook;
+
+    dprintf_hook( stddeb, "Removing hook "NPFMT"\n", hook );
+
+    if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return FALSE;
+    if (data->inHookProc)
+    {
+        /* Mark it for deletion later on */
+        dprintf_hook( stddeb, "Hook still running, deletion delayed\n" );
+        data->proc = (FARPROC)0;
+        return TRUE;
+    }
+
+    /* Remove it from the linked list */
+
+    if (data->ownerQueue)
+    {
+        MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( data->ownerQueue );
+        if (!queue) return FALSE;
+        prevHook = &queue->hooks[data->id - WH_FIRST_HOOK];
+    }
+    else prevHook = &HOOK_systemHooks[data->id - WH_FIRST_HOOK];
+
+    while (*prevHook && *prevHook != hook)
+        prevHook = &((HOOKDATA *)USER_HEAP_LIN_ADDR(*prevHook))->next;
+
+     if (!*prevHook) return FALSE;
+    *prevHook = data->next;
+    USER_HEAP_FREE( hook );
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           HOOK_CallHook
+ *
+ * Call a hook procedure.
+ */
+static DWORD HOOK_CallHook( HANDLE hook, short code,
+                            WPARAM wParam, LPARAM lParam )
+{
+    HOOKDATA *data;
+    MESSAGEQUEUE *queue;
+    HANDLE prevHook;
+    DWORD ret;
+
+    /* Find the first hook with a valid proc */
+
+    for (;;)
+    {
+        if (!hook) return 0;
+        if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return 0;
+        if (data->proc) break;
+        hook = data->next;
+    }
+
+    /* Now call it */
+
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+    prevHook = queue->hCurHook;
+    queue->hCurHook = hook;
+    data->inHookProc = 1;
+
+    dprintf_hook( stddeb, "Calling hook "NPFMT": %d %04lx %08lx\n",
+                  hook, code, (DWORD)wParam, lParam );
+    ret = CallHookProc( data->proc, code, wParam, lParam );
+    dprintf_hook( stddeb, "Ret hook "NPFMT" = %08lx\n", hook, ret );
+
+    data->inHookProc = 0;
+    queue->hCurHook = prevHook;
+    if (!data->proc) HOOK_RemoveHook( hook );
+    return ret;
+}
+
+
+/***********************************************************************
+ *           HOOK_CallHooks
+ *
+ * Call a hook chain.
+ */
+DWORD HOOK_CallHooks( short id, short code, WPARAM wParam, LPARAM lParam )
+{
+    HANDLE hook = HOOK_GetHook( id );
+    if (!hook) return 0;
+    return HOOK_CallHook( hook, code, wParam, lParam );
+}
 
 
 /***********************************************************************
@@ -26,55 +217,44 @@
  */
 FARPROC SetWindowsHook( short id, HOOKPROC proc )
 {
-  HHOOK hhook = SetWindowsHookEx( id, proc, 0, 0 );
-  HOOKDATA *data = PTR_SEG_TO_LIN(hhook);
-  if (data != NULL)  {
-    data = PTR_SEG_TO_LIN(data->next);
-    if (data != NULL)  {
-      return data->proc;
-    }
-  }
-  return 0;
+#ifdef WINELIB
+    HINSTANCE hInst = 0;
+#else
+    HINSTANCE hInst = FarGetOwner( HIWORD(proc) );
+#endif
+    /* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */
+    HTASK hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
+
+    HANDLE handle = HOOK_SetHook( id, proc, hInst, hTask );
+    if (!handle) return -1;
+    if (!((HOOKDATA *)USER_HEAP_LIN_ADDR( handle ))->next) return 0;
+    /* Not sure if the return value is correct; should not matter much
+     * since it's never used (see DefHookProc). -- AJ */
+#ifdef WINELIB32
+    return (FARPROC)handle;
+#else
+    return (FARPROC)MAKELONG( handle, HOOK_MAGIC );
+#endif
 }
 
 
 /***********************************************************************
  *           UnhookWindowsHook   (USER.234)
  */
-BOOL UnhookWindowsHook( short id, FARPROC hproc )
+BOOL UnhookWindowsHook( short id, HOOKPROC proc )
 {
-  HHOOK *prevHook,hhook;
-  
-  prevHook = &TASK_HOOK(id);
-  while (*prevHook)  {
-    HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(*prevHook);
+    HANDLE hook = HOOK_GetHook( id );
 
-    if (data->proc == hproc) {
-      hhook = *prevHook;
-      *prevHook = data->next;
-#ifdef WINELIB32
-      USER_HEAP_FREE((HANDLE)hhook);
-#else
-      USER_HEAP_FREE(LOWORD(hhook));
-#endif
-      return TRUE;
+    dprintf_hook( stddeb, "UnhookWindowsHook: %d %08lx\n", id, (DWORD)proc );
+
+    while (hook)
+    {
+        HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook);
+        if (data->proc == proc) break;
+        hook = HOOK_GetNextHook( hook );
     }
-  }
-  prevHook = &SYSTEM_HOOK(id);
-  while (*prevHook) {
-    HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(*prevHook);
-    if (data->proc == hproc) {
-      hhook = *prevHook;
-      *prevHook = data->next;
-#ifdef WINELIB32
-      USER_HEAP_FREE((HANDLE)hhook);
-#else
-      USER_HEAP_FREE(LOWORD(hhook));
-#endif
-      return TRUE;
-    }
-  }
-  return FALSE;
+    if (!hook) return FALSE;
+    return HOOK_RemoveHook( hook );
 }
 
 
@@ -83,7 +263,14 @@
  */
 DWORD DefHookProc( short code, WORD wParam, DWORD lParam, HHOOK *hhook )
 {
-    return CallNextHookEx( *hhook, code, wParam, lParam );
+    /* Note: the *hhook parameter is never used, since we rely on the
+     * current hook value from the task queue to find the next hook. */
+    MESSAGEQUEUE *queue;
+    HANDLE next;
+
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
+    if (!(next = HOOK_GetNextHook( queue->hCurHook ))) return 0;
+    return HOOK_CallHook( next, code, wParam, lParam );
 }
 
 
@@ -92,47 +279,23 @@
  */
 BOOL CallMsgFilter( SEGPTR msg, short code )
 {
-    if (CALL_TASK_HOOK( WH_MSGFILTER, code, 0, (LPARAM)msg )) 
-	return TRUE;
-    return CALL_SYSTEM_HOOK( WH_SYSMSGFILTER, code, 0, (LPARAM)msg );
+    if (GetSysModalWindow()) return FALSE;
+    if (HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) return TRUE;
+    return HOOK_CallHooks( WH_MSGFILTER, code, 0, (LPARAM)msg );
 }
 
 
 /***********************************************************************
  *           SetWindowsHookEx   (USER.291)
  */
-HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hinst, HTASK htask )
+HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hInst, HTASK hTask )
 {
-    HOOKDATA *data;
-    HANDLE handle;
-    HHOOK *prevHook;
-
-    if ((id < FIRST_HOOK) || (id > LAST_HOOK)) return 0;
-    if (id != WH_GETMESSAGE && id != WH_CALLWNDPROC) {
-	fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,"NPFMT","NPFMT")!\n",
-                 id, (DWORD)proc, hinst, htask );
-    }
-    if (htask)  /* Task-specific hook */
-    {
-	if ((id == WH_JOURNALRECORD) || (id == WH_JOURNALPLAYBACK) ||
-	    (id == WH_SYSMSGFILTER)) return 0;
-	prevHook = &TASK_HOOK( id );
-    }
-    else  /* System-wide hook */
-    {
-	prevHook = &SYSTEM_HOOK( id );
-    }
-    
-    handle = (HANDLE) USER_HEAP_ALLOC( sizeof(*data) );
-    if (!handle) return 0;
-    data   = (HOOKDATA *) USER_HEAP_LIN_ADDR( handle );
-
-    data->next  = *prevHook;
-    data->proc  = proc;
-    data->id    = id;
-    data->htask = htask;
-    *prevHook   = (HHOOK)USER_HEAP_SEG_ADDR(handle);
-    return *prevHook;
+    HANDLE handle = HOOK_SetHook( id, proc, hInst, hTask );
+#ifdef WINELIB32
+    return (HHOOK)handle;
+#else
+    return MAKELONG( handle, HOOK_MAGIC );
+#endif
 }
 
 
@@ -141,22 +304,12 @@
  */
 BOOL UnhookWindowsHookEx( HHOOK hhook )
 {
-    HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(hhook);
-    HHOOK *prevHook;
-
-    if (!data) return FALSE;
-    prevHook = data->htask ? &TASK_HOOK(data->id) : &SYSTEM_HOOK(data->id);
-    while (*prevHook && (*prevHook != hhook)) {    
-	prevHook = &((HOOKDATA *)*prevHook)->next;
-    }
-    if (!*prevHook) return FALSE;
-    *prevHook = data->next;
 #ifdef WINELIB32
-    USER_HEAP_FREE( (HANDLE)hhook );
+    return HOOK_RemoveHook( (HANDLE)hhook );
 #else
-    USER_HEAP_FREE( hhook & 0xffff );
+    if (HIWORD(hhook) != HOOK_MAGIC) return FALSE;  /* Not a new format hook */
+    return HOOK_RemoveHook( LOWORD(hhook) );
 #endif
-    return TRUE;
 }
 
 
@@ -165,7 +318,8 @@
  */
 DWORD CallNextHookEx( HHOOK hhook, short code, WPARAM wParam, LPARAM lParam )
 {
-    HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(hhook);
-    if (data == NULL || !data->next) return 0;
-    else return INTERNAL_CALL_HOOK( data->next, code, wParam, lParam );
+    HANDLE next;
+    if (HIWORD(hhook) != HOOK_MAGIC) return 0;  /* Not a new format hook */
+    if (!(next = HOOK_GetNextHook( LOWORD(hhook) ))) return 0;
+    return HOOK_CallHook( next, code, wParam, lParam );
 }
diff --git a/windows/message.c b/windows/message.c
index a309356..8360974 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -52,29 +52,12 @@
     int queueSize;
 
     queueSize = sizeof(MESSAGEQUEUE) + size * sizeof(QMSG);
-    if (!(hQueue = GlobalAlloc( GMEM_FIXED, queueSize ))) return 0;
+    if (!(hQueue = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, queueSize )))
+        return 0;
     msgQueue = (MESSAGEQUEUE *) GlobalLock( hQueue );
-    msgQueue->next = 0;
-    msgQueue->hTask = 0;
     msgQueue->msgSize = sizeof(QMSG);
-    msgQueue->msgCount = 0;
-    msgQueue->nextMessage = 0;
-    msgQueue->nextFreeMessage = 0;
     msgQueue->queueSize = size;
-    msgQueue->GetMessageTimeVal = 0;
-    msgQueue->GetMessagePosVal = 0;
-    msgQueue->GetMessageExtraInfoVal = 0;
-    msgQueue->lParam = 0;
-    msgQueue->wParam = 0;
-    msgQueue->msg = 0;
-    msgQueue->hWnd = 0;
-    msgQueue->wPostQMsg = 0;
-    msgQueue->wExitCode = 0;
-    msgQueue->InSendMessageHandle = 0;
-    msgQueue->wPaintCount = 0;
-    msgQueue->wTimerCount = 0;
-    msgQueue->tempStatus = 0;
-    msgQueue->status = 0;
+    msgQueue->wWinVersion = 0;  /* FIXME? */
     GlobalUnlock( hQueue );
     return hQueue;
 }
@@ -292,6 +275,7 @@
     static WORD  lastClickMsg = 0;
     static POINT lastClickPos = { 0, 0 };
     POINT pt = msg->pt;
+    MOUSEHOOKSTRUCT hook = { msg->pt, 0, HTCLIENT, 0 };
 
     BOOL mouseClick = ((msg->message == WM_LBUTTONDOWN) ||
 		       (msg->message == WM_RBUTTONDOWN) ||
@@ -304,7 +288,10 @@
 	msg->hwnd = GetCapture();
 	ScreenToClient( msg->hwnd, &pt );
 	msg->lParam = MAKELONG( pt.x, pt.y );
-	return TRUE;  /* No need to further process the message */
+        /* No need to further process the message */
+        hook.hwnd = msg->hwnd;
+        return !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
+                                msg->message, (LPARAM)MAKE_SEGPTR(&hook));
     }
    
     if ((hittest = MSG_GetWindowForEvent( msg->pt, &msg->hwnd )) != HTERROR)
@@ -389,7 +376,10 @@
     }
     msg->lParam = MAKELONG( pt.x, pt.y );
     
-    return TRUE;
+    hook.hwnd = msg->hwnd;
+    hook.wHitTestCode = hittest;
+    return !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
+                            msg->message, (LPARAM)MAKE_SEGPTR(&hook));
 }
 
 
@@ -400,7 +390,7 @@
  * Return value indicates whether the translated message must be passed
  * to the user.
  */
-static BOOL MSG_TranslateKeyboardMsg( MSG *msg )
+static BOOL MSG_TranslateKeyboardMsg( MSG *msg, BOOL remove )
 {
       /* Should check Ctrl-Esc and PrintScreen here */
 
@@ -412,7 +402,8 @@
 	msg->hwnd = GetActiveWindow();
 	msg->message += WM_SYSKEYDOWN - WM_KEYDOWN;
     }
-    return TRUE;
+    return !HOOK_CallHooks( WH_KEYBOARD, remove ? HC_ACTION : HC_NOREMOVE,
+                            msg->wParam, msg->lParam );
 }
 
 
@@ -439,9 +430,15 @@
         }
         else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST))
         {
-            if (!MSG_TranslateKeyboardMsg( msg )) continue;
+            if (!MSG_TranslateKeyboardMsg( msg, remove )) continue;
         }
-        else continue;  /* Should never happen */
+        else  /* Non-standard hardware event */
+        {
+            HARDWAREHOOKSTRUCT hook = { msg->hwnd, msg->message,
+                                        msg->wParam, msg->lParam };
+            if (HOOK_CallHooks( WH_HARDWARE, remove ? HC_ACTION : HC_NOREMOVE,
+                                0, (LPARAM)MAKE_SEGPTR(&hook) )) continue;
+        }
 
           /* Check message against filters */
 
@@ -451,7 +448,13 @@
         if ((msg->hwnd != GetDesktopWindow()) && 
             (GetWindowTask(msg->hwnd) != GetCurrentTask()))
             continue;  /* Not for this task */
-        if (remove) MSG_RemoveMsg( sysMsgQueue, pos );
+        if (remove)
+        {
+            MSG tmpMsg = *msg; /* FIXME */
+            HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION,
+                            0, (LPARAM)MAKE_SEGPTR(&tmpMsg) );
+            MSG_RemoveMsg( sysMsgQueue, pos );
+        }
         return TRUE;
     }
     return FALSE;
@@ -955,8 +958,7 @@
 {
     MSG_PeekMessage( (MSG *)PTR_SEG_TO_LIN(msg),
                      hwnd, first, last, PM_REMOVE, FALSE );
-    CALL_TASK_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg );
-    CALL_SYSTEM_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg );
+    HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, 0, (LPARAM)msg );
     return (((MSG *)PTR_SEG_TO_LIN(msg))->message != WM_QUIT);
 }
 
@@ -1066,8 +1068,7 @@
 
     EnterSpyMessage(SPY_SENDMESSAGE, hwnd, msg, wParam, lParam);
 
-    CALL_TASK_HOOK( WH_CALLWNDPROC, HC_ACTION, 1, MAKE_SEGPTR(&msgstruct) );
-    CALL_SYSTEM_HOOK( WH_CALLWNDPROC, HC_ACTION, 1, MAKE_SEGPTR(&msgstruct) );
+    HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 1, MAKE_SEGPTR(&msgstruct) );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) 
     {
         ExitSpyMessage(SPY_RESULT_INVALIDHWND,hwnd,msg,0);
@@ -1142,6 +1143,7 @@
         {
             HINSTANCE ds = msg->hwnd ? WIN_GetWindowInstance( msg->hwnd )
                                      : (HINSTANCE)CURRENT_DS;
+/*            HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
 	    return CallWndProc( (WNDPROC)msg->lParam, ds, msg->hwnd,
                                 msg->message, msg->wParam, GetTickCount() );
         }
@@ -1152,6 +1154,7 @@
     if (!wndPtr->lpfnWndProc) return 0;
     painting = (msg->message == WM_PAINT);
     if (painting) wndPtr->flags |= WIN_NEEDS_BEGINPAINT;
+/*    HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
     retval = CallWindowProc( wndPtr->lpfnWndProc, msg->hwnd, msg->message,
 			     msg->wParam, msg->lParam );
     if (painting && IsWindow(msg->hwnd) &&
@@ -1222,6 +1225,14 @@
 }
 
 /***********************************************************************
+ *           GetCurrentTime  (effectively identical to GetTickCount)
+ */
+DWORD GetCurrentTime(void)
+{
+  return GetTickCount();
+}
+
+/***********************************************************************
  *			InSendMessage	(USER.192
  *
  * According to the book, this should return true iff the current message
diff --git a/windows/utility.c b/windows/utility.c
index 8838394..d0cb299 100644
--- a/windows/utility.c
+++ b/windows/utility.c
@@ -1,5 +1,5 @@
 /*	utility.c	Utility functions for Wine
- *			Author:		acb
+ *			Author:		Andrew Bulhak
  *			Commenced:	10-9-1993
  *
  *			This unit contains the implementations of
@@ -19,8 +19,6 @@
 #include "debug.h"
 
 
-/* static char Copyright[] = "Copyright Andrew C. Bulhak, 1993"; */
-
 
 /*	MulDiv is a simple function that may as well have been
  *	implemented as a macro; however Microsoft, in their infinite
@@ -424,24 +422,3 @@
 	return result;
 };
 
-/******************************************************************************
- *                              DragDetect ( USER.465 )
- *
- * Hardly ever called at all
- */
-
-
-/******************************************************************************
- *                              DragObject ( USER.464 )
- *
- * responsible for generation of WM_QUERYDROPOBJECT, WM_DRAGLOOP, 
- *                               WM_DRAGMOVE,        WM_DROPOBJECT
- */
-LONG DragObject(HWND hDesktop, HWND hWnd, UINT Unknown1, WORD Unknown2, WORD Unknown3, HCURSOR hCursor)
-{
-
- fprintf(stdnimp,"DragObject: EmptyStub!!!\n");
- return 0;
-}
- 
-
diff --git a/windows/win.c b/windows/win.c
index 1e0d209..7153ee6 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -31,6 +31,11 @@
 static HWND hwndDesktop = 0;
 static HWND hWndSysModal = 0;
 
+static WORD wDragWidth = 8;
+static WORD wDragHeight= 6;
+
+extern HCURSOR CURSORICON_IconToCursor(HICON);
+
 /***********************************************************************
  *           WIN_FindWndPtr
  *
@@ -1205,7 +1210,16 @@
  */
 BOOL AnyPopup()
 {
-	dprintf_win(stdnimp,"EMPTY STUB !! AnyPopup !\n");
+ WND   *wndPtr = WIN_FindWndPtr(hwndDesktop);
+ HWND   hwnd = wndPtr->hwndChild;
+ 
+ for( ; hwnd ; hwnd = wndPtr->hwndNext )
+  {
+	wndPtr = WIN_FindWndPtr(hwnd);
+	if(wndPtr->hwndOwner)
+	   if(wndPtr->dwStyle & WS_VISIBLE)
+		return TRUE;
+  }
 	return FALSE;
 }
 
@@ -1238,3 +1252,246 @@
 {
 	return hWndSysModal;
 }
+
+/*******************************************************************
+ *			DRAG_QueryUpdate
+ *
+ * recursively find a child that contains spDragInfo->pt point 
+ * and send WM_QUERYDROPOBJECT
+ */
+BOOL DRAG_QueryUpdate( HWND hQueryWnd, SEGPTR spDragInfo )
+{
+ HWND		hWnd;
+ BOOL		wParam,bResult = 0;
+ POINT		pt;
+ LPDRAGINFO	ptrDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN(spDragInfo);
+ WND 	       *ptrQueryWnd = WIN_FindWndPtr(hQueryWnd),*ptrWnd;
+ RECT		tempRect;	/* this sucks */
+
+ if( !ptrQueryWnd || !ptrDragInfo ) return 0;
+
+ pt 		= ptrDragInfo->pt;
+
+ GetWindowRect(hQueryWnd,&tempRect); 
+
+ if( !PtInRect(&tempRect,pt) ||
+     (ptrQueryWnd->dwStyle & WS_DISABLED) )
+	return 0;
+
+ if( !(ptrQueryWnd->dwStyle & WS_MINIMIZE) ) 
+   {
+     tempRect = ptrQueryWnd->rectClient;
+     if(ptrQueryWnd->dwStyle & WS_CHILD)
+        MapWindowPoints(ptrQueryWnd->hwndParent,0,(LPPOINT)&tempRect,2);
+
+     if( PtInRect(&tempRect,pt) )
+	{
+	 wParam = 0;
+	 ptrWnd = WIN_FindWndPtr(hWnd = ptrQueryWnd->hwndChild);
+
+	 for( ;ptrWnd ;ptrWnd = WIN_FindWndPtr(hWnd = ptrWnd->hwndNext) )
+	   if( ptrWnd->dwStyle & WS_VISIBLE )
+	     {
+	      GetWindowRect(hWnd,&tempRect);
+
+	      if( PtInRect(&tempRect,pt) ) 
+		  break;
+	     }
+
+	 if(ptrWnd)
+	    dprintf_msg(stddeb,"DragQueryUpdate: hwnd = "NPFMT", %i %i - %i %i\n",hWnd,
+			     ptrWnd->rectWindow.left,ptrWnd->rectWindow.top,
+			     ptrWnd->rectWindow.right,ptrWnd->rectWindow.bottom);	 
+	 else
+	    dprintf_msg(stddeb,"DragQueryUpdate: hwnd = "NPFMT"\n",hWnd);
+
+	 if(ptrWnd)
+	   if( !(ptrWnd->dwStyle & WS_DISABLED) )
+	        bResult = DRAG_QueryUpdate(hWnd, spDragInfo);
+
+	 if(bResult) return bResult;
+	}
+     else wParam = 1;
+   }
+ else wParam = 1;
+
+ ScreenToClient(hQueryWnd,&ptrDragInfo->pt);
+
+ ptrDragInfo->hScope = hQueryWnd;
+
+ bResult = SendMessage( hQueryWnd ,WM_QUERYDROPOBJECT ,
+                       (WPARAM)wParam ,(LPARAM) spDragInfo );
+ if( !bResult ) 
+      ptrDragInfo->pt = pt;
+
+ return bResult;
+}
+
+/*******************************************************************
+ *                      DragDetect ( USER.465 )
+ *
+ */
+BOOL DragDetect(HWND hWnd, POINT pt)
+{
+  MSG   msg;
+  RECT  rect;
+
+  rect.left = pt.x - wDragWidth;
+  rect.right = pt.x + wDragWidth;
+
+  rect.top = pt.y - wDragHeight;
+  rect.bottom = pt.y + wDragHeight;
+
+  SetCapture(hWnd);
+
+  while(1)
+   {
+        while(PeekMessage(&msg ,0 ,WM_MOUSEFIRST ,WM_MOUSELAST ,PM_REMOVE))
+         {
+           if( msg.message == WM_LBUTTONUP )
+                {
+                  ReleaseCapture();
+                  return 0;
+                }
+           if( msg.message == WM_MOUSEMOVE )
+		{
+		  POINT pt = { LOWORD(msg.lParam), HIWORD(msg.lParam) };
+                  if( !PtInRect( &rect, pt ) )
+                    {
+                      ReleaseCapture();
+                      return 1;
+                    }
+		}
+         }
+        WaitMessage();
+   }
+
+  return 0;
+}
+
+/******************************************************************************
+ *                              DragObject ( USER.464 )
+ *
+ */
+DWORD DragObject(HWND hwndScope, HWND hWnd, WORD wObj, HANDLE hOfStruct,
+                WORD szList , HCURSOR hCursor)
+{
+ MSG	 	msg;
+ LPDRAGINFO	lpDragInfo;
+ SEGPTR		spDragInfo;
+ HCURSOR 	hDragCursor=0, hOldCursor=0, hBummer=0;
+ HANDLE		hDragInfo  = GlobalAlloc( GMEM_SHARE | GMEM_ZEROINIT, 2*sizeof(DRAGINFO));
+ WND           *wndPtr = WIN_FindWndPtr(hWnd);
+ DWORD		dwRet = 0;
+ short	 	dragDone = 0;
+ HCURSOR	hCurrentCursor = 0;
+ HWND		hCurrentWnd = 0;
+ WORD	        btemp;
+
+ fprintf(stdnimp,"DragObject: experimental\n"); 
+
+ lpDragInfo = (LPDRAGINFO) GlobalLock(hDragInfo);
+ spDragInfo = (SEGPTR) WIN16_GlobalLock(hDragInfo);
+
+ if( !lpDragInfo || !spDragInfo ) return 0L;
+
+ hBummer = LoadCursor(0,IDC_BUMMER);
+
+ if( !hBummer || !wndPtr )
+   {
+        GlobalFree(hDragInfo);
+        return 0L;
+   }
+
+ if(hCursor)
+   {
+	if( !(hDragCursor = CURSORICON_IconToCursor(hCursor)) )
+	  {
+	   GlobalFree(hDragInfo);
+	   return 0L;
+	  }
+
+	if( hDragCursor == hCursor ) hDragCursor = 0;
+	else hCursor = hDragCursor;
+
+	hOldCursor = SetCursor(hDragCursor);
+   }
+
+ lpDragInfo->hWnd   = hWnd;
+ lpDragInfo->hScope = 0;
+ lpDragInfo->wFlags = wObj;
+ lpDragInfo->hList  = szList; /* near pointer! */
+ lpDragInfo->hOfStruct = hOfStruct;
+ lpDragInfo->l = 0L; 
+
+ SetCapture(hWnd);
+ ShowCursor(1);
+
+ while( !dragDone )
+  {
+    WaitMessage();
+
+    if( !PeekMessage(&msg,0,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE) )
+	 continue;
+
+   *(lpDragInfo+1) = *lpDragInfo;
+
+    lpDragInfo->pt = msg.pt;
+
+    /* update DRAGINFO struct */
+    dprintf_msg(stddeb,"drag: lpDI->hScope = "NPFMT"\n",lpDragInfo->hScope);
+
+    if( (btemp = (WORD)DRAG_QueryUpdate(hwndScope, spDragInfo)) > 0 )
+	 hCurrentCursor = hCursor;
+    else
+        {
+         hCurrentCursor = hBummer;
+         lpDragInfo->hScope = 0;
+	}
+    if( hCurrentCursor )
+        SetCursor(hCurrentCursor);
+
+    dprintf_msg(stddeb,"drag: got "NPFMT"\n",btemp);
+
+    /* send WM_DRAGLOOP */
+    SendMessage( hWnd, WM_DRAGLOOP, (WPARAM)(hCurrentCursor != hBummer) , 
+	                            (LPARAM) spDragInfo );
+    /* send WM_DRAGSELECT or WM_DRAGMOVE */
+    if( hCurrentWnd != lpDragInfo->hScope )
+	{
+	 if( hCurrentWnd )
+	   SendMessage( hCurrentWnd, WM_DRAGSELECT, 0, 
+		       (LPARAM)MAKELONG(LOWORD(spDragInfo)+sizeof(DRAGINFO),
+				        HIWORD(spDragInfo)) );
+	 hCurrentWnd = lpDragInfo->hScope;
+	 if( hCurrentWnd )
+           SendMessage( hCurrentWnd, WM_DRAGSELECT, 1, (LPARAM)spDragInfo); 
+	}
+    else
+	if( hCurrentWnd )
+	   SendMessage( hCurrentWnd, WM_DRAGMOVE, 0, (LPARAM)spDragInfo);
+
+
+    /* check if we're done */
+    if( msg.message == WM_LBUTTONUP || msg.message == WM_NCLBUTTONUP )
+	dragDone = TRUE;
+  }
+
+ ReleaseCapture();
+ ShowCursor(0);
+
+ if( hCursor )
+   {
+     SetCursor(hOldCursor);
+     if( hDragCursor )
+	 DestroyCursor(hDragCursor);
+   }
+
+ if( hCurrentCursor != hBummer ) 
+	dwRet = SendMessage( lpDragInfo->hScope, WM_DROPOBJECT, 
+			     hWnd, (LPARAM)spDragInfo );
+ GlobalFree(hDragInfo);
+
+ return dwRet;
+}
+
diff --git a/windows/winpos.c b/windows/winpos.c
index 119b265..08a499c 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -616,7 +616,7 @@
     WND *wndPtr = WIN_FindWndPtr( winpos->hwnd );
     if (!wndPtr || (winpos->flags & SWP_NOSIZE)) return 0;
     if ((wndPtr->dwStyle & WS_THICKFRAME) ||
-	(wndPtr->dwStyle & (WS_POPUP | WS_CHILD) == 0))
+	((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) == 0))
     {
 	NC_GetMinMaxInfo( winpos->hwnd, &maxSize, NULL, NULL, NULL );
 	winpos->cx = MIN( winpos->cx, maxSize.x );
