Release 940518

Tue May 17 23:03:16 1994  Bob Amstadt  (bob@pooh)

	* [windows/dce.c]
	Fixed bug with dce initialization that was causing dialog boxes to not
	be displayed.

	* [if1632/callback.c]
	Better fix for bug found by Martin.

Sat May 14 19:48:39 1994  Rick Sladkey  (jrs@world.std.com)

        * [ memory/heap.c ]
        Redirect HEAP_ReAlloc calls with NULL argument to HEAP_Alloc.

May 16, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [objects/font.c]
	Make EnumFonts() calling a callback with dummy fonts ... :-)

	* [objects/text.c]
	Add Empty Stub for ExtTextOut(), which temporarely call Textout().

	* [if1632/callback.c]
	Temporarely go around bug in CallWindowProc(), you will see printfs.

	* [controls/edit.c]
	Make EDIT controls focused by a mouse click.

	* [misc/property.c]
	Bug Fix in function EnumProps(), better use of CallBack16().

	* [misc/mmsystem.c]
	Basic Skelton's for MCI messages dispatching function.

Sun May 15 16:15:17 1994  Erik Bos (erik@hacktic.nl)

        * [windows/utility.c]
        Added windows_wsprintf() for the emulator, wsprintf() is
        for libwine.

Sat May 14 22:16:40 1994  Rick Sladkey  (jrs@world.std.com)

        * [misc/cursor.c]
        Fix pointer problems in LoadCursor leading to heap corruption.

        *  [ controls/menu.c ]
        Fix two NULL dereferencing bugs.

Sun May 15 20:07:48 1994  Rick Sladkey  (jrs@world.std.com)

        * [objects/font.c]
        Fix NULL pointer dereferencing bug in GetCharWidth.

        * [loader/resource.c]
        Fix under-allocation of memory in LoadAccelerators.

        * [windows/class.c]
        Ignore negative sizes for extra fields in RegisterClass.

Sun May 15 06:35:03 1994  David Metcalfe <david@prism.demon.co.uk>

        * [objects/metafile.c] [include/metafile.h] [include/windows.h]
          [objects/gdiobj.c] [objects/brush.c] [objects/pen.c]
          [objects/text.c] [objects/dcvalues.c] [windows/graphics.c]
          [windows/dc.c] [windows/mapping.c]
        Beginnings of metafile support.

        * [misc/file.c]
        Corrected spelling of _lcreat.

        * [controls/edit.c]
        Minor bug fixes.
diff --git a/ChangeLog b/ChangeLog
index ed79d40..ed36b23 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,77 @@
 ----------------------------------------------------------------------
+Tue May 17 23:03:16 1994  Bob Amstadt  (bob@pooh)
+
+	* [windows/dce.c]
+	Fixed bug with dce initialization that was causing dialog boxes to not
+	be displayed.
+
+	* [if1632/callback.c]
+	Better fix for bug found by Martin.
+
+Sat May 14 19:48:39 1994  Rick Sladkey  (jrs@world.std.com)
+
+        * [ memory/heap.c ]
+        Redirect HEAP_ReAlloc calls with NULL argument to HEAP_Alloc.
+
+May 16, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [objects/font.c]
+	Make EnumFonts() calling a callback with dummy fonts ... :-)
+
+	* [objects/text.c]
+	Add Empty Stub for ExtTextOut(), which temporarely call Textout().
+
+	* [if1632/callback.c]
+	Temporarely go around bug in CallWindowProc(), you will see printfs.
+
+	* [controls/edit.c]
+	Make EDIT controls focused by a mouse click.
+
+	* [misc/property.c]
+	Bug Fix in function EnumProps(), better use of CallBack16().
+
+	* [misc/mmsystem.c]
+	Basic Skelton's for MCI messages dispatching function.
+
+Sun May 15 16:15:17 1994  Erik Bos (erik@hacktic.nl)
+
+        * [windows/utility.c]
+        Added windows_wsprintf() for the emulator, wsprintf() is
+        for libwine.
+
+Sat May 14 22:16:40 1994  Rick Sladkey  (jrs@world.std.com)
+
+        * [misc/cursor.c]
+        Fix pointer problems in LoadCursor leading to heap corruption.
+
+        *  [ controls/menu.c ]
+        Fix two NULL dereferencing bugs.
+
+Sun May 15 20:07:48 1994  Rick Sladkey  (jrs@world.std.com)
+
+        * [objects/font.c]
+        Fix NULL pointer dereferencing bug in GetCharWidth.
+
+        * [loader/resource.c]
+        Fix under-allocation of memory in LoadAccelerators.
+
+        * [windows/class.c]
+        Ignore negative sizes for extra fields in RegisterClass.
+
+Sun May 15 06:35:03 1994  David Metcalfe <david@prism.demon.co.uk>
+
+        * [objects/metafile.c] [include/metafile.h] [include/windows.h]
+          [objects/gdiobj.c] [objects/brush.c] [objects/pen.c]
+          [objects/text.c] [objects/dcvalues.c] [windows/graphics.c]
+          [windows/dc.c] [windows/mapping.c]
+        Beginnings of metafile support.
+
+        * [misc/file.c]
+        Corrected spelling of _lcreat.
+
+        * [controls/edit.c]
+        Minor bug fixes.
+----------------------------------------------------------------------
 May 9, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
 
 	* [controls/scroll.c]
diff --git a/Imakefile b/Imakefile
index 5f12665..f87fc8f 100644
--- a/Imakefile
+++ b/Imakefile
@@ -61,6 +61,7 @@
 	debugger.o \
 	memory.o \
 	miscemu.o \
+	opcodes.o \
 	readline.o
 
 LIBOBJS = \
@@ -97,3 +98,6 @@
 depend::
 
 install::
+
+etags::
+	etags `find . -name '*.[chS]'`
\ No newline at end of file
diff --git a/README b/README
index 40aadbc..1d735be 100644
--- a/README
+++ b/README
@@ -171,6 +171,13 @@
 
 7. WHAT'S NEW
 
+WHAT'S NEW with Wine-940518: (see ChangeLog for details)
+	- debugger improvements
+	- bug fixes to get some dialog boxes working.
+	- skeleton for passing MCI functions.
+	- beginnings of metafile support.
+	- and many many bug fixes!
+
 WHAT'S NEW with Wine-940510: (see ChangeLog for details)
 	- debugger improvements
 	- mmsystem
diff --git a/controls/edit.c b/controls/edit.c
index 55678c0..5528247 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -309,6 +309,7 @@
 	break;
 
     case WM_KEYDOWN:
+	printf("EDIT WM_KEYDOWN w=%04X !\n", wParam);
 	EDIT_KeyDownMsg(hwnd, wParam);
 	break;
 
@@ -319,6 +320,7 @@
 
     case WM_LBUTTONDOWN:
 	HideCaret(hwnd);
+	SetFocus(hwnd);
 	EDIT_LButtonDownMsg(hwnd, wParam, lParam);
 	SetCaretPos(es->WndCol, es->WndRow * es->txtht);
 	ShowCaret(hwnd);
@@ -2043,8 +2045,6 @@
     WND *wndPtr = WIN_FindWndPtr(hwnd);
     EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
 
-    if ((short)(lParam) < 0 || (short)(lParam >> 16) < 0)
-	return;
     so = LOWORD(lParam);
     eo = HIWORD(lParam);
     if (so > eo)
@@ -2343,7 +2343,7 @@
     WND *wndPtr = WIN_FindWndPtr(hwnd);
     EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
 
-    if (wParam == 0xffff)   /* really -1 */
+    if (wParam == (WORD)-1)
 	return (LONG)(es->SelBegLine);
     else
 	EDIT_GetLineCol(hwnd, wParam, &row, &col);
@@ -2362,7 +2362,7 @@
     EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
     unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
 
-    if (wParam == 0xffff)    /* really -1 */
+    if (wParam == (WORD)-1)
 	wParam = es->CurrLine;
 
     return (LONG)(*(textPtrs + wParam));
diff --git a/controls/menu.c b/controls/menu.c
index 9ef90f41..e41c968 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -502,46 +502,53 @@
 
 void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y)
 {
-	HDC		hDC;
-	RECT	rect;
-	HMENU	hSubMenu;
-	LPMENUITEM	lpitem, lpitem2;
-	LPPOPUPMENU lppop2;
-	WORD	wRet;
-/*	if ((wParam & MK_LBUTTON) != 0) { */
-	if (GetKeyState(VK_LBUTTON)	!= 0) {
-		lpitem = MenuFindItem(lppop, x, y, &wRet);
+    HDC		hDC;
+    RECT	rect;
+    HMENU	hSubMenu;
+    LPMENUITEM	lpitem, lpitem2;
+    LPPOPUPMENU lppop2;
+    WORD	wRet;
+
+    if (GetKeyState(VK_LBUTTON)	!= 0) 
+    {
+	lpitem = MenuFindItem(lppop, x, y, &wRet);
 #ifdef DEBUG_MENU
-		printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
-												x, y, wRet, lpitem);
+	printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
+	       x, y, wRet, lpitem);
 #endif
-		if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
-			lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-			hDC = GetWindowDC(hWnd);
-			if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
-				HideAllSubPopupMenu(lppop);
-				}
-			MenuItemSelect(hWnd, lppop, wRet);
-			if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-				hSubMenu = (HMENU)lpitem->item_id;
-				lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
-				if (lppop2 == NULL) {
-					ReleaseDC(hWnd, hDC);
-					return;
-					}
-				if (lppop->BarFlag) {
-					lppop2->hWndParent = hWnd;
-					GetWindowRect(hWnd, &rect);
-					rect.top += lppop->rect.bottom;
-					TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-						rect.left + lpitem->rect.left, rect.top, 
-						0, lppop->ownerWnd, (LPRECT)NULL);
-					}
-				GlobalUnlock(hSubMenu);
-				}
-			ReleaseDC(hWnd, hDC);
-			}
+	if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) 
+	{
+	    lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+	    hDC = GetWindowDC(hWnd);
+	    if ((lpitem2 != NULL ) &&
+		(lpitem2->item_flags & MF_POPUP) == MF_POPUP) 
+	    {
+		HideAllSubPopupMenu(lppop);
+	    }
+	    MenuItemSelect(hWnd, lppop, wRet);
+	    if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) 
+	    {
+		hSubMenu = (HMENU)lpitem->item_id;
+		lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+		if (lppop2 == NULL) 
+		{
+		    ReleaseDC(hWnd, hDC);
+		    return;
 		}
+		if (lppop->BarFlag) 
+		{
+		    lppop2->hWndParent = hWnd;
+		    GetWindowRect(hWnd, &rect);
+		    rect.top += lppop->rect.bottom;
+		    TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+				   rect.left + lpitem->rect.left, rect.top, 
+				   0, lppop->ownerWnd, (LPRECT)NULL);
+		}
+		GlobalUnlock(hSubMenu);
+	    }
+	    ReleaseDC(hWnd, hDC);
+	}
+    }
 }
 
 
@@ -562,38 +569,46 @@
 void MenuItemSelect0(HWND hWnd, LPPOPUPMENU lppop, 
 				LPMENUITEM lpitem, WORD wIndex)
 {
-	LPMENUITEM lpprev;
-	if (lppop == NULL) return;
-	if (lppop->FocusedItem != (WORD)-1) {
-	    lpprev = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if (lpprev != NULL) {
-			lpprev->item_flags &= MF_HILITE ^ 0xFFFF;
-			if ((lpprev->item_flags & MF_POPUP) == MF_POPUP)
-				HideAllSubPopupMenu(lppop);
-			if (lppop->BarFlag)
-				DrawMenuBar(hWnd);
-			else {
-				InvalidateRect(hWnd, &lpprev->rect, TRUE);
-				UpdateWindow(hWnd);
-				}
-			}
-		}
+    LPMENUITEM lpprev;
+    
+    if (lppop == NULL) 
+	return;
+    if (lppop->FocusedItem != (WORD)-1) 
+    {
+	lpprev = GetMenuItemPtr(lppop, lppop->FocusedItem);
+	if (lpprev != NULL) 
+	{
+	    lpprev->item_flags &= MF_HILITE ^ 0xFFFF;
+	    if ((lpprev->item_flags & MF_POPUP) == MF_POPUP)
+		HideAllSubPopupMenu(lppop);
+	    if (lppop->BarFlag)
+		DrawMenuBar(hWnd);
+	    else 
+	    {
+		InvalidateRect(hWnd, &lpprev->rect, TRUE);
+		UpdateWindow(hWnd);
+	    }
+	}
+    }
     lppop->FocusedItem = wIndex;
-	if (lpitem == NULL || wIndex == (WORD)-1) {
-		ResetHiliteFlags(lppop);
-		if (lppop->BarFlag) DrawMenuBar(hWnd);
-		}
-	else {
-		lpitem->item_flags |= MF_HILITE;
-		if (lppop->BarFlag)
-			DrawMenuBar(hWnd);
-		else {
-			InvalidateRect(hWnd, &lpitem->rect, TRUE);
-			UpdateWindow(hWnd);
-			}
-		}
+    if (lpitem == NULL || wIndex == (WORD)-1) 
+    {
+	ResetHiliteFlags(lppop);
+	if (lppop->BarFlag) DrawMenuBar(hWnd);
+    }
+    else 
+    {
+	lpitem->item_flags |= MF_HILITE;
+	if (lppop->BarFlag)
+	    DrawMenuBar(hWnd);
+	else 
+	{
+	    InvalidateRect(hWnd, &lpitem->rect, TRUE);
+	    UpdateWindow(hWnd);
+	}
 	SendMessage(hWnd, WM_MENUSELECT, lpitem->item_id, 
-					MAKELONG(0, lpitem->item_flags));
+		    MAKELONG(0, lpitem->item_flags));
+    }
 }
 
 
@@ -1984,7 +1999,6 @@
 		return FALSE;
 		}
 	lpmenu->ownerWnd = hWnd;
-	printf("SetMenu(%04X, %04X) // %04X\n", hWnd, hMenu, lpmenu->ownerWnd);
 	ResetHiliteFlags(lpmenu);
 	if (GetCapture() == hWnd) ReleaseCapture();
 	GlobalUnlock(hMenu);
diff --git a/debugger/Imakefile b/debugger/Imakefile
index 5958e7d..8f4d8a7 100644
--- a/debugger/Imakefile
+++ b/debugger/Imakefile
@@ -5,32 +5,23 @@
 
 MODULE = debugger
 
-SUBDIRS = readline
+SUBDIRS = opcodes readline
 
-DEFINES = -DUSE_READLINE
-
-/* Quick and dirt hack, since i386 is defined as 1. sigh */
-#define temp i386
-#undef i386
+DEFINES = -DUSE_READLINE -Iopcodes
 
 SRCS = \
 	dbg.tab.c \
 	break.c \
 	hash.c \
 	lex.yy.c \
-	info.c \
-	i386-pinsn.c
+	info.c
 
 OBJS = \
 	dbg.tab.o \
 	break.o \
 	hash.o \
 	lex.yy.o \
-	info.o \
-	i386-pinsn.o
-
-#define i386 temp
-#undef temp
+	info.o
 
 /*
  * All the SUBDIR stuff
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 7dea72f..e99e218 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -19,7 +19,8 @@
 unsigned int dbg_mask = 0;
 unsigned int dbg_mode = 0;
 
-void issue_prompt();
+void issue_prompt(void);
+void mode_command(int);
 %}
 
 
@@ -50,7 +51,7 @@
 
  line:		'\n'
 	| infocmd '\n'
-	| error '\n'       {yyerrok; }
+	| error '\n'       { yyerrok; }
 	| QUIT  '\n'       { exit(0); };
 	| HELP  '\n'       { dbg_help(); };
 	| CONT '\n'        { return; };
@@ -161,6 +162,7 @@
 		dbg_mode = 16;
 	};
 #endif
+	fprintf(stderr,"In %d bit mode.\n", dbg_mode);
 
 	/* This is intended to read the entry points from the Windows image, and
 	   insert them in the hash table.  It does not work yet, so it is commented out. */
diff --git a/debugger/info.c b/debugger/info.c
index 0a98d89..b4b2358 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -5,33 +5,23 @@
  */
 
 #include <stdio.h>
+#include "opcodes/dis-asm.h"
 #include "regpos.h"
 
 extern int * regval;
 extern unsigned int dbg_mask;
 extern unsigned int dbg_mode;
 
-extern int print_insn(char * memaddr, char * realaddr, FILE * stream, int addrlen);
-
-/* THese three helper functions eliminate the need for patching the
-module from gdb for disassembly of code */
-
 void application_not_running()
 {
   fprintf(stderr,"Application not running\n");
 }
 
-void read_memory(char * memaddr, char * buffer, int len){
-	memcpy(buffer, memaddr, len);
-}
-
-void fputs_filtered(char * buffer, FILE * outfile){
-	fputs(buffer, outfile);
-}
-
 void print_address(unsigned int addr, FILE * outfile){
 	char * name;
-	name = find_nearest_symbol(addr);
+	extern char * find_nearest_symbol(unsigned int *);
+
+	name = find_nearest_symbol((unsigned int *) addr);
 	if(name)
 		fprintf(outfile,"0x%8.8x(%s)", addr, name);
 	else
@@ -39,12 +29,36 @@
 
 }
 
+void print_address_info(bfd_vma addr, disassemble_info * info){
+	print_address((unsigned int) addr, info->stream);
+}
+
+int print_insn(char *realmemaddr, char *memaddr, FILE *stream, int addrlen){
+	static disassemble_info info;
+	static int initialized = 0;
+
+	if (!initialized) {
+		INIT_DISASSEMBLE_INFO(info, stderr);
+		info.print_address_func = print_address_info;
+		initialized = 1;
+	}
+	info.stream = stream;
+	info.buffer = memaddr;
+	info.buffer_vma = (bfd_vma) realmemaddr;
+	info.buffer_length = 1024;
+	if (addrlen == 16)
+		return print_insn_i286((bfd_vma) realmemaddr, &info);
+	if (addrlen == 32)
+		return print_insn_i386((bfd_vma) realmemaddr, &info);
+	fprintf(stderr, "invalid address length %d.\n", addrlen);
+	return 0;
+}
 
 void info_reg(){
 
 	  if(!regval) {
 	    application_not_running();
-	    return 0;
+	    return;
 	  }
 
 	fprintf(stderr,"Register dump:\n");
@@ -73,7 +87,7 @@
 
 	if(!regval) {
 	  application_not_running();
-	  return 0;
+	  return;
 	}
 
 	fprintf(stderr,"Stack dump:\n");
@@ -234,10 +248,7 @@
 "",
 "The disassembly code seems to work most of the time, but it does get",
 "a little confused at times.  The 16 bit mode probably has not been used",
-"much so there are probably bugs.  I snagged the file from the gdb-4.7",
-"source tree, which is what was on my latest cdrom.  I should check to see",
-"if newer versions of gdb have anything substanitally different for the",
-"disassembler.",
+"much so there are probably bugs.",
 "",
 NULL};
 
@@ -271,7 +282,7 @@
 
   if(!regval) {
     application_not_running();
-    return 0;
+    return;
   }
 
   fprintf(stderr,"Backtrace:\n");
diff --git a/if1632/callback.c b/if1632/callback.c
index ac2ab9f..02f5cda 100644
--- a/if1632/callback.c
+++ b/if1632/callback.c
@@ -1,6 +1,8 @@
 static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
 static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
 
+#include <stdio.h>
+#include <stdlib.h>
 #include "windows.h"
 #include "callback.h"
 #include "wine.h"
@@ -143,9 +145,39 @@
 		     WORD wParam, LONG lParam )
 {
     SpyMessage(hwnd, message, wParam, lParam);
-    
-    if (Is16bitAddress(func))
+
+    if (HIWORD((LONG)func) == WINE_CODE_SELECTOR) 
+    {
+	static struct dll_table_entry_s *user_tab = NULL;
+	void *address = (void *) ((LONG) func & 0xffff);
+
+	if (user_tab == NULL)
+	    user_tab = FindDLLTable("USER");
+
+	/* DefWindowProc */
+	if (user_tab[104].address == address)
+	    return DefWindowProc(hwnd, message, wParam, lParam);
+	
+	/* DefDlgProc */
+	else if (user_tab[308].address == address)
+	    return DefDlgProc(hwnd, message, wParam, lParam);
+	
+	/* DefMDIChildProc */
+	else if (user_tab[447].address == address)
+	    return DefMDIChildProc(hwnd, message, wParam, lParam);
+	
+	/* default */
+	else
+	{
+	    fprintf(stderr, "wine: Unknown wine callback %08x\n", func);
+	    exit(1);
+	}
+    }
+    else if (Is16bitAddress(func))
     {	
+#ifdef DEBUG_CALLBACK
+	printf("CallWindowProc // 16bit func=%08X !\n", func);
+#endif 
 	PushOn16( CALLBACK_SIZE_WORD, hwnd );
 	PushOn16( CALLBACK_SIZE_WORD, message );
 	PushOn16( CALLBACK_SIZE_WORD, wParam );
@@ -155,6 +187,9 @@
     }
     else
     {
+#ifdef DEBUG_CALLBACK
+	printf("CallWindowProc // 32bit func=%08X !\n", func);
+#endif 
 	return (*func)(hwnd, message, wParam, lParam);
     }
 }
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 9a87ccc..10c2ba9 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -129,9 +129,9 @@
 #122 pascal ReSurRection
 #123 pascal PlayMetaFile
 #124 pascal GetMetaFile
-#125 pascal CreateMetaFile
-#126 pascal CloseMetaFile
-#127 pascal DeleteMetaFile
+125 pascal CreateMetaFile(ptr) CreateMetaFile(1)
+126 pascal CloseMetaFile(word) CloseMetaFile(1)
+127 pascal DeleteMetaFile(word) DeleteMetaFile(1)
 128 pascal MulDiv(s_word s_word s_word) MulDiv(1 2 3)
 129 pascal SaveVisRgn(word) SaveVisRgn(1)
 130 pascal RestoreVisRgn(word) RestoreVisRgn(1)
@@ -219,7 +219,7 @@
 #312 pascal CONVERTOUTLINEFONTFILE
 #313 pascal GETRASTERIZERCAPS
 #314 pascal ENGINEEXTTEXTOUT
-#330 pascal ENUMFONTFAMILIES
+330 pascal EnumFontFamilies(word ptr ptr ptr) EnumFontFamilies(1 2 3 4)
 #332 pascal GETKERNINGPAIRS
 345 pascal GetTextAlign(word) GetTextAlign(1)
 346 pascal SetTextAlign(word word) SetTextAlign(1 2)
@@ -227,7 +227,8 @@
 	   Chord(1 2 3 4 5 6 7 8 9)
 349 pascal SetMapperFlags(word word) SetMapperFlags(1 2)
 350 pascal GetCharWidth(word word word ptr) GetCharWidth(1 2 3 4)
-#351 pascal EXTTEXTOUT
+351 pascal ExtTextOut(word s_word s_word word ptr ptr s_word ptr) 
+		ExtTextOut(1 2 3 4 5 6 7 8)
 #352 pascal GETPHYSICALFONTHANDLE
 #353 pascal GETASPECTRATIOFILTER
 #354 pascal SHRINKGDIHEAP
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 0744f78..2f00be8 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -81,7 +81,7 @@
 #80 RESERVED4
 81  pascal _lclose(word) _lclose(1)
 82  pascal _lread(word ptr word) _lread(1 2 3)
-83  pascal _lcreate(ptr word) _lcreate(1 2)
+83  pascal _lcreat(ptr word) _lcreat(1 2)
 84  pascal _llseek(word long word) _llseek(1 2 3)
 85  pascal _lopen(ptr word) _lopen(1 2)
 86  pascal _lwrite(word ptr word) _lwrite(1 2 3)
diff --git a/if1632/pop.h b/if1632/pop.h
new file mode 100644
index 0000000..ff2d961
--- /dev/null
+++ b/if1632/pop.h
@@ -0,0 +1,16 @@
+	add	$8,%esp
+	popw	%es
+	add	$2,%esp
+	popw	%ds
+	add	$2,%esp
+	popl	%edi
+	popl	%esi
+	popl	%ebp
+	add	$4,%esp
+	popl	%ebx
+	popl	%edx
+	popl	%ecx
+	popl	%eax
+	add	$16,%esp
+	popfl
+	add	$20,%esp
diff --git a/if1632/shell.spec b/if1632/shell.spec
index 52499e3..fb44c1c 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -9,33 +9,33 @@
 # 			proper parameters. It's just to have stub for PROGMAN.EXE ...
 #
 
-  1 pascal RegOpenKey() RegOpenKey()
-  2 pascal RegCreateKey() RegCreateKey()
-  3 pascal RegCloseKey() RegCloseKey()
-  4 pascal RegDeleteKey() RegDeleteKey()
-  9 pascal DragAcceptFiles() DragAcceptFiles()
- 20 pascal ShellExecute(ptr) ShellExecute(1) 
+  1 pascal RegOpenKey(word ptr ptr) RegOpenKey(1 2 3)
+  2 pascal RegCreateKey(word ptr ptr) RegCreateKey(1 2 3)
+  3 pascal RegCloseKey(word) RegCloseKey(1)
+  4 pascal RegDeleteKey(word ptr) RegDeleteKey(1 2)
+  5 pascal RegSetValue(word ptr long ptr long) RegSetValue(1 2 3 4 5)
+  6 pascal RegQueryValue(word ptr ptr ptr) RegQueryValue(1 2 3 4)
+  7 pascal RegEnumKey(word long ptr long) RegEnumKey(1 2 3 4)
+  9 pascal DragAcceptFiles(word word) DragAcceptFiles(1 2)
+ 11 pascal DragQueryFile(word s_word ptr s_word) DragQueryFile(1 2 3 4)
+ 12 pascal DragFinish(word) DragFinish(1)
+ 13 pascal DragQueryPoint(word ptr) DragQueryPoint(1 2)
+ 20 pascal ShellExecute(word ptr ptr ptr ptr s_word) ShellExecute(1 2 3 4 5 6) 
+ 21 pascal FindExecutable(ptr ptr ptr) FindExecutable(1 2 3)
+ 22 pascal ShellAbout(word ptr ptr word) ShellAbout(1 2 3 4)
+ 33 pascal AboutDlgProc(word word word long) AboutDlgProc(1 2 3 4)
+ 34 pascal ExtractIcon(word ptr s_word) ExtractIcon(1 2 3)
 102 pascal RegisterShellHook(ptr) RegisterShellHook(1)
 103 pascal ShellHookProc() ShellHookProc()
 
 #  8   7  0000  WEP exported, shared data
-# 33   9  0136  ABOUTDLGPROC exported, shared data
-# 34  10  021a  EXTRACTICON exported, shared data
-# 21   4  1154  FINDEXECUTABLE exported, shared data
 #100   4  0550  HERETHARBETYGARS exported, shared data
 # 38   5  0000  FINDENVIRONMENTSTRING exported, shared data
-#  7   2  14dc  REGENUMKEY exported, shared data
 # 37   5  00ae  DOENVIRONMENTSUBST exported, shared data
 # 20   4  110a  SHELLEXECUTE exported, shared data
 #101   8  010e  FINDEXEDLGPROC exported, shared data
-# 11   6  0094  DRAGQUERYFILE exported, shared data
-# 13   6  0000  DRAGQUERYPOINT exported, shared data
-#  5   2  16f4  REGSETVALUE exported, shared data
 # 39  10  026e  INTERNALEXTRACTICON exported, shared data
-# 22   9  0000  SHELLABOUT exported, shared data
-#  6   2  168e  REGQUERYVALUE exported, shared data
 # 32   9  0829  WCI exported, shared data
 # 36  10  08dc  EXTRACTASSOCIATEDICON exported, shared data
-# 12   6  0142  DRAGFINISH exported, shared data
 
 
diff --git a/if1632/user.spec b/if1632/user.spec
index a2aa4bd..1bb9eed 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -108,6 +108,7 @@
 102 pascal AdjustWindowRect(ptr long word) AdjustWindowRect(1 2 3)
 103 pascal MapDialogRect(word ptr) MapDialogRect(1 2)
 104 pascal MessageBeep(word) MessageBeep(1)
+105 pascal FlashWindow(word word) FlashWindow(1 2)
 106 pascal GetKeyState(word) GetKeyState(1)
 107 pascal DefWindowProc(word word word long) DefWindowProc(1 2 3 4)
 108 pascal GetMessage(ptr word word word) GetMessage(1 2 3 4)
@@ -357,7 +358,9 @@
 417 pascal GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions()
 418 pascal SetMenuItemBitmaps(word word word word word) 
 	   SetMenuItemBitmaps(1 2 3 4 5)
-420 pascal wsprintf(ptr ptr) wsprintf(1 2)
+420 pascal wsprintf() windows_wsprintf()
+# windows_wsprintf() handles arguments itself, as libc can't handle an
+# 16-bit stack. DLLRelay() will pass 16-bit stack pointer as 1st arg.
 421 pascal wvsprintf(ptr ptr ptr) wvsprintf(1 2 3)
 #422 DLGDIRSELECTEX
 #423 DLGDIRSELECTCOMBOBOXEX
diff --git a/include/heap.h b/include/heap.h
index 94ba9c9..22fe129 100644
--- a/include/heap.h
+++ b/include/heap.h
@@ -60,16 +60,18 @@
  */
 typedef struct global_mem_desc_s
 {
-    struct global_mem_desc_s *next;
-    struct global_mem_desc_s *prev;
-    unsigned short handle;
-    short sequence;
-    void *addr;
-    int length;
-    int lock_count;
-    void *linear_addr;
-    int linear_key;
-    int linear_count;
+    struct global_mem_desc_s *next;	/* Next GDESC in list              */
+    struct global_mem_desc_s *prev;	/* Previous GDESC in list          */
+    unsigned short handle;		/* Handle of this block.	   */
+    short          sequence;		/* Block sequence # in huge block  */
+    void          *addr;		/* Address allocated with mmap()   */
+    int            length;		/* Length of block		   */
+    int            lock_count;		/* Block lock count		   */
+    unsigned short alias;		/* Offset-zero alias selector      */
+    unsigned int   alias_key;		/* Offset-zero alias sh. mem. key  */
+    void          *linear_addr;		/* Linear address of huge block    */
+    int            linear_key;		/* Linear shared memory key        */
+    int            linear_count;	/* Linear lock count               */
 } GDESC;
 
 extern GDESC *GlobalList;
diff --git a/include/segmem.h b/include/segmem.h
index b0f38f7..afe7741 100644
--- a/include/segmem.h
+++ b/include/segmem.h
@@ -6,6 +6,8 @@
 #ifndef SEGMEM_H
 #define SEGMEM_H
 
+#include "wine.h"
+
 #ifdef __linux__
 #define HAVE_IPC
 #include <sys/ipc.h>
@@ -77,13 +79,10 @@
 
 static __inline__ int Is16bitAddress(void *address)
 {
-    return ((int) address >= (((FIRST_SELECTOR << 3) | 0x0007) << 16));
+    return ((unsigned int) address 
+	    >= (((FIRST_SELECTOR << 3) | 0x0007) << 16));
 }
 
 extern SEGDESC Segments[];
 
 #endif /* SEGMEM_H */
-
-
-
-
diff --git a/include/windows.h b/include/windows.h
index 6d92ddd..0b27568 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -45,7 +45,7 @@
 DECLARE_HANDLE(HBITMAP);
 DECLARE_HANDLE(HBRUSH);
 DECLARE_HANDLE(LOCALHANDLE);
-
+DECLARE_HANDLE(HMETAFILE);
 
 #define TRUE 1
 #define FALSE 0
@@ -850,14 +850,6 @@
 #define ALTERNATE         1
 #define WINDING           2
 
-typedef struct {
-	DWORD rdSize;
-	WORD rdFunction, rdParam[1];
-} METARECORD;
-typedef METARECORD *LPMETARECORD;
-typedef METARECORD *NPMETARECORD;
-typedef METARECORD *PMETARECORD;
-
   /* Background modes */
 #define TRANSPARENT       1
 #define OPAQUE            2
@@ -1334,12 +1326,6 @@
 #define	WF_PAGING	0x0800
 #define	WF_WLO          0x8000
 
-typedef struct 
-{
-	HANDLE objectHandle[1];
-}HANDLETABLE;
-typedef HANDLETABLE *LPHANDLETABLE;
-
 #define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))
 
 #define IDI_APPLICATION MAKEINTRESOURCE(32512)
@@ -2240,6 +2226,126 @@
 #define WM_ASKCBFORMATNAME  0x030C
 #define WM_CHANGECBCHAIN    0x030D
 
+/* Metafile header structure */
+typedef struct tagMETAHEADER
+{
+    WORD       mtType;
+    WORD       mtHeaderSize;
+    WORD       mtVersion;
+    DWORD      mtSize __attribute__ ((packed));
+    WORD       mtNoObjects;
+    DWORD      mtMaxRecord __attribute__ ((packed));
+    WORD       mtNoParameters;
+} METAHEADER;
+
+/* Metafile typical record structure */
+typedef struct tagMETARECORD
+{
+    DWORD      rdSize;
+    WORD       rdFunction;
+    WORD       rdParam[1];
+} METARECORD;
+typedef METARECORD *PMETARECORD;
+typedef METARECORD *LPMETARECORD;
+
+/* Handle table structure */
+typedef struct tagHANDLETABLE
+{
+    HANDLE     objectHandle[1];
+} HANDLETABLE;
+typedef HANDLETABLE *PHANDLETABLE;
+typedef HANDLETABLE *LPHANDLETABLE;
+
+/* Clipboard metafile picture structure */
+typedef struct tagMETAFILEPICT
+{
+    int        mm;
+    int        xExt;
+    int        yExt;
+    HMETAFILE  hMF;
+} METAFILEPICT;
+typedef METAFILEPICT *LPMETAFILEPICT;
+
+/* Metafile functions */
+#define META_SETBKCOLOR              0x0201
+#define META_SETBKMODE               0x0102
+#define META_SETMAPMODE              0x0103
+#define META_SETROP2                 0x0104
+#define META_SETRELABS               0x0105
+#define META_SETPOLYFILLMODE         0x0106
+#define META_SETSTRETCHBLTMODE       0x0107
+#define META_SETTEXTCHAREXTRA        0x0108
+#define META_SETTEXTCOLOR            0x0209
+#define META_SETTEXTJUSTIFICATION    0x020A
+#define META_SETWINDOWORG            0x020B
+#define META_SETWINDOWEXT            0x020C
+#define META_SETVIEWPORTORG          0x020D
+#define META_SETVIEWPORTEXT          0x020E
+#define META_OFFSETWINDOWORG         0x020F
+#define META_SCALEWINDOWEXT          0x0410
+#define META_OFFSETVIEWPORTORG       0x0211
+#define META_SCALEVIEWPORTEXT        0x0412
+#define META_LINETO                  0x0213
+#define META_MOVETO                  0x0214
+#define META_EXCLUDECLIPRECT         0x0415
+#define META_INTERSECTCLIPRECT       0x0416
+#define META_ARC                     0x0817
+#define META_ELLIPSE                 0x0418
+#define META_FLOODFILL               0x0419
+#define META_PIE                     0x081A
+#define META_RECTANGLE               0x041B
+#define META_ROUNDRECT               0x061C
+#define META_PATBLT                  0x061D
+#define META_SAVEDC                  0x001E
+#define META_SETPIXEL                0x041F
+#define META_OFFSETCLIPRGN           0x0220
+#define META_TEXTOUT                 0x0521
+#define META_BITBLT                  0x0922
+#define META_STRETCHBLT              0x0B23
+#define META_POLYGON                 0x0324
+#define META_POLYLINE                0x0325
+#define META_ESCAPE                  0x0626
+#define META_RESTOREDC               0x0127
+#define META_FILLREGION              0x0228
+#define META_FRAMEREGION             0x0429
+#define META_INVERTREGION            0x012A
+#define META_PAINTREGION             0x012B
+#define META_SELECTCLIPREGION        0x012C
+#define META_SELECTOBJECT            0x012D
+#define META_SETTEXTALIGN            0x012E
+#define META_DRAWTEXT                0x062F
+#define META_CHORD                   0x0830
+#define META_SETMAPPERFLAGS          0x0231
+#define META_SETTEXTOUT              0x0A32
+#define META_SETDIBTODEV             0x0D33
+#define META_SELECTPALETTE           0x0234
+#define META_REALIZEPALETTE          0x0035
+#define META_ANIMATEPALETTE          0x0436
+#define META_SETPALENTRIES           0x0037
+#define META_POLYPOLYGON             0x0538
+#define META_RESIZEPALETTE           0x0139
+#define META_DIBBITBLT               0x0940
+#define META_DIBSTRETCHBLT           0x0B41
+#define META_DIBCREATEPATTERNBRUSH   0x0142
+#define META_STRETCHDIB              0x0F43
+#define META_EXTFLOODFILL            0x0548
+#define META_RESETDC                 0x014C
+#define META_STARTDOC                0x014D
+#define META_STARTPAGE               0x004F
+#define META_ENDPAGE                 0x0050
+#define META_ABORTDOC                0x0052
+#define META_ENDDOC                  0x005E
+#define META_DELETEOBJECT            0x01F0
+#define META_CREATEPALETTE           0x00F7
+#define META_CREATEBRUSH             0x00F8
+#define META_CREATEPATTERNBRUSH      0x01F9
+#define META_CREATEPENINDIRECT       0x02FA
+#define META_CREATEFONTINDIRECT      0x02FB
+#define META_CREATEBRUSHINDIRECT     0x02FC
+#define META_CREATEBITMAPINDIRECT    0x02FD
+#define META_CREATEBITMAP            0x06FE
+#define META_CREATEREGION            0x06FF
+
 
 #define F(ret,name) ret name(void);
 #define Fa(ret,name,t1,a1) ret name(t1 a1);
@@ -2338,7 +2444,7 @@
 Fa(ATOM,GlobalFindAtom,LPCSTR,a)
 Fa(BOOL,BringWindowToTop,HWND,a)
 Fa(BOOL,DeleteDC,HDC,a)
-Fa(BOOL,DeleteMetaFile,HANDLE,a)
+Fa(BOOL,DeleteMetaFile,HMETAFILE,a)
 Fa(BOOL,DeleteObject,HANDLE,a)
 Fa(BOOL,DestroyCursor,HCURSOR,a)
 Fa(BOOL,DestroyIcon,HICON,a)
@@ -2392,7 +2498,7 @@
 Fa(DWORD,OemKeyScan,WORD,a)
 Fa(FARPROC,LocalNotify,FARPROC,a)
 Fa(HANDLE,BeginDeferWindowPos,int,nNumWindows)
-Fa(HANDLE,CloseMetaFile,HANDLE,a)
+Fa(HMETAFILE,CloseMetaFile,HANDLE,a)
 Fa(HANDLE,CreateMetaFile,LPSTR,a)
 Fa(HANDLE,GetAtomHandle,ATOM,a)
 Fa(HANDLE,GetClipboardData,WORD,a)
@@ -2680,8 +2786,8 @@
 Fc(BOOL,LineTo,HDC,a,short,b,short,c)
 Fc(WORD,GetInternalWindowPos,HWND,a,LPRECT,b,LPPOINT,c)
 Fc(LONG,_llseek,INT,a,LONG,b,INT,c)
-Fc(WORD,_lread,INT,a,LPSTR,b,INT,c)
-Fc(WORD,_lwrite,INT,a,LPSTR,b,INT,c)
+Fc(INT,_lread,INT,a,LPSTR,b,INT,c)
+Fc(INT,_lwrite,INT,a,LPSTR,b,INT,c)
 Fc(int,FillRect,HDC,a,LPRECT,b,HBRUSH,c)
 Fc(DWORD,MoveTo,HDC,a,short,b,short,c)
 Fc(BOOL,CheckMenuItem,HMENU,a,WORD,b,WORD,c)
@@ -2896,7 +3002,7 @@
 Fg(int,GetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
 Fg(int,SetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
 Fg(BOOL,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g)
-Fh(BOOL,ExtTextOut,HDC,a,int,b,int,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
+Fh(BOOL,ExtTextOut,HDC,a,short,b,short,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
 Fh(HANDLE,DeferWindowPos,HANDLE,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,int,x,int,y,int,cx,int,cy,WORD,wFlags)
 Fh(LONG,TabbedTextOut,HDC,a,int,b,int,c,LPSTR,d,int,e,int,f,LPINT,g,int,h)
 Fh(int,ScrollWindowEx,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g,WORD,h)
diff --git a/loader/library.c b/loader/library.c
index cede6ec..6cfbe08 100644
--- a/loader/library.c
+++ b/loader/library.c
@@ -117,6 +117,7 @@
 
     if (FindDLLTable(libname))
     {
+    printf("Library was a builtin - returning 0x23\n");
 	return WINE_CODE_SELECTOR;
     }
 
diff --git a/loader/resource.c b/loader/resource.c
index dbd7d92..a5fb3c8 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -573,7 +573,7 @@
     HANDLE 	rsc_mem;
     BYTE 	*lp;
     ACCELHEADER	*lpAccelTbl;
-    int 	i, image_size;
+    int 	i, image_size, n;
 #ifdef DEBUG_ACCEL
     if (((LONG)lpTableName & 0xFFFF0000L) == 0L)
 	printf("LoadAccelerators: instance = %04X, name = %08X\n",
@@ -597,11 +597,12 @@
 #ifdef DEBUG_ACCEL
     printf("LoadAccelerators / image_size=%d\n", image_size);
 #endif
+    n = image_size/5;
     hAccel = GlobalAlloc(GMEM_MOVEABLE, 
-    	sizeof(ACCELHEADER) + sizeof(ACCELENTRY) + image_size);
+    	sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
     lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
     lpAccelTbl->wCount = 0;
-    for (i = 0; ; i++) {
+    for (i = 0; i < n; i++) {
 	lpAccelTbl->tbl[i].type = *(lp++);
 	lpAccelTbl->tbl[i].wEvent = *((WORD *)lp);
 	lp += 2;
@@ -895,6 +896,10 @@
 		buffer[i] = '\0';
 		}
 	else {
+		if (buflen > 1) {
+			buffer[0] = '\0';
+			return 0;
+			}
 		printf("LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
 		printf("LoadString // and try to obtain string '%s'\n", p + 1);
 		}
diff --git a/loader/task.c b/loader/task.c
index 980ddc7..856f634 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -102,14 +102,14 @@
 	printf("EnumTaskWindows // found hTask=%04X !\n", hTask);
 	wptr = lpTask->lpWndList;
 	if (wptr == NULL) return FALSE;
+	if (lpEnumFunc == NULL)	return FALSE;
 	while ((hWnd = *(wptr++)) != 0) {
 		if (++count >= MAXWIN_PER_TASK) return FALSE;
 		printf("EnumTaskWindows // hWnd=%04X count=%d !\n", hWnd, count);
 #ifdef WINELIB
-		if (lpEnumFunc != NULL)	bRet = (*lpEnumFunc)(hWnd, lParam); 
+		bRet = (*lpEnumFunc)(hWnd, lParam); 
 #else
-		if (lpEnumFunc != NULL)	
-			bRet = CallBack16(lpEnumFunc, 2, lParam, (int) hWnd);
+		bRet = CallBack16(lpEnumFunc, 2, 0, (int)hWnd, 2, (int)lParam);
 #endif
 		if (bRet == 0) break;
 		}
diff --git a/memory/global.c b/memory/global.c
index 29717e0..c257027 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -103,18 +103,20 @@
 	for (count = 0; count < n_segments; count++, s++)
 	{
 	    g = (GDESC *) malloc(sizeof(*g));
-	    if (g == NULL) {
+	    if (g == NULL) 
+	    {
 		printf("GlobalGetFreeSegments // bad GDESC malloc !\n");
 		return NULL;
-		}
-	    g->prev = g_prev;
-	    g->next = NULL;
-	    g->handle = s->selector;
-	    g->sequence = -1;
-	    g->addr = s->base_addr;
-	    g->length = s->length;
-	    g->linear_addr = NULL;
-	    g->linear_key = 0;
+	    }
+	    g->prev         = g_prev;
+	    g->next         = NULL;
+	    g->handle       = s->selector;
+	    g->sequence     = -1;
+	    g->addr         = s->base_addr;
+	    g->length       = s->length;
+	    g->alias        = 0;
+	    g->linear_addr  = NULL;
+	    g->linear_key   = 0;
 	    g->linear_count = 0;
 	    if (!(flags & GLOBAL_FLAGS_MOVEABLE))
 		g->lock_count = 1;
@@ -139,14 +141,16 @@
     g = g_start;
     for (i = 0; i < n_segments; i++, g = g->next)
     {
-	if (g == NULL) {
+	if (g == NULL) 
+	{
 	    printf("GlobalGetFreeSegments // bad Segments chain !\n");
 	    return NULL;
-	    }
-	g->sequence = i + 1;
-	g->length = n_segments;
-	g->linear_addr = NULL; 
-	g->linear_key = 0;
+	}
+	g->sequence     = i + 1;
+	g->length       = n_segments;
+	g->alias        = 0;
+	g->linear_addr  = NULL; 
+	g->linear_key   = 0;
 	g->linear_count = 0;
     }
 
@@ -154,6 +158,15 @@
 }
 
 /**********************************************************************
+ *					WIN16_GlobalAlloc
+ */
+HANDLE
+WIN16_GlobalAlloc(unsigned int flags, unsigned long size)
+{
+    return GlobalAlloc(flags & ~GLOBAL_FLAGS_MOVEABLE, size);
+}
+
+/**********************************************************************
  *					GlobalAlloc
  */
 HANDLE
@@ -234,14 +247,15 @@
 	if (g == NULL)
 	    return 0;
 
-	g->handle = next_unused_handle;
-	g->sequence = 0;
-	g->addr = m;
-	g->linear_addr = NULL;
-	g->linear_key = 0;
+	g->handle       = next_unused_handle;
+	g->sequence     = 0;
+	g->addr         = m;
+	g->alias        = 0;
+	g->linear_addr  = NULL;
+	g->linear_key   = 0;
 	g->linear_count = 0;
-	g->length = size;
-	g->next = g_prev->next;
+	g->length       = size;
+	g->next         = g_prev->next;
 	if (g->next) g->next->prev = g;
 	g->lock_count = 0;
 
@@ -323,28 +337,15 @@
 {
     GDESC *g;
 
-    if (block == 0)
+    if ((g = GlobalGetGDesc(block)) == NULL)
 	return 0;
 
-    /*
-     * Find GDESC for this block.
-     */
-    for (g = GlobalList; g != NULL; g = g->next)
-    {
-	if (g->handle == block)
-	{
-	    g->lock_count++;
-#ifdef DEBUG_HEAP
-	    printf("GlobalLock: returning %08x\n", g->addr);
-#endif
-	    return g->addr;
-	}
-    }
+    g->lock_count++;
 
 #ifdef DEBUG_HEAP
-    printf("GlobalLock: returning %08x\n", 0);
+    printf("GlobalLock: returning %08x\n", g->addr);
 #endif
-    return NULL;
+    return g->addr;
 }
 
 /**********************************************************************
diff --git a/memory/heap.c b/memory/heap.c
index 471d5fe..c54c0ee 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -116,23 +116,28 @@
 {
     MDESC *m_free;
     MDESC *m;
+
+
+    if (!old_block)
+	return HEAP_Alloc(free_list, flags, new_size);
+    
     /*
      * Check validity of block
      */
     m = (MDESC *) old_block - 1;
+
 #ifdef DEBUG_HEAP
-	printf("HEAP_ReAlloc new_size=%d !\n", new_size);
-	printf("HEAP_ReAlloc old_block=%08X !\n", old_block);
-	printf("HEAP_ReAlloc m=%08X free_list=%08X !\n", m, free_list);
-	printf("HEAP_ReAlloc m->prev=%08X !\n", m->prev);
-	printf("HEAP_ReAlloc m->next=%08X !\n", m->next);
-	printf("HEAP_ReAlloc *free_list=%08X !\n", *free_list);
+    printf("HEAP_ReAlloc new_size=%d !\n", new_size);
+    printf("HEAP_ReAlloc old_block=%08X !\n", old_block);
+    printf("HEAP_ReAlloc m=%08X free_list=%08X !\n", m, free_list);
+    printf("HEAP_ReAlloc m->prev=%08X !\n", m->prev);
+    printf("HEAP_ReAlloc m->next=%08X !\n", m->next);
+    printf("HEAP_ReAlloc *free_list=%08X !\n", *free_list);
 #endif
-	if (m->prev != m || m->next != m || 
+
+    if (m->prev != m || m->next != m || 
 	((int) m & 0xffff0000) != ((int) *free_list & 0xffff0000))
     {
-	printf("Attempt to resize bad pointer, m = %08x, *free_list = %08x\n",
-	       m, free_list);
 #ifdef DEBUG_HEAP
 	printf("Attempt to resize bad pointer, m = %08x, *free_list = %08x\n",
 	       m, free_list);
@@ -144,8 +149,9 @@
      * Check for grow block
      */
 #ifdef DEBUG_HEAP
-	printf("HEAP_ReAlloc Check for grow block !\n");
+    printf("HEAP_ReAlloc Check for grow block !\n");
 #endif
+
     if (new_size > m->length)
     {
 	m_free = m + 1 + m->length / sizeof(MDESC);
diff --git a/misc/cursor.c b/misc/cursor.c
index 874ff92..49ce26c 100644
--- a/misc/cursor.c
+++ b/misc/cursor.c
@@ -171,7 +171,7 @@
 	ReleaseDC(GetDesktopWindow(), hdc); 
 	return 0;
  	}
-    lp += 2;
+	(char *)lp += 2;
     for (j = 0; j < 16; j++)
     	printf("%04X ", *(lp + j));
 /*
@@ -180,7 +180,7 @@
     else
 */
         lpcur->hBitmap = 0;
-    lp += sizeof(BITMAP);
+/*     lp += sizeof(BITMAP); */
     for (i = 0; i < 81; i++) {
 	char temp = *((char *)lp + 162 + i);
 	*((char *)lp + 162 + i) = *((char *)lp + 324 - i);
diff --git a/misc/file.c b/misc/file.c
index ff4bcba..3348f75 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -12,7 +12,7 @@
  *
  * DEC 93 Erik Bos (erik@(trashcan.)hacktic.nl)
  *		- Existing functions modified to use dosfs functions.
- *		- Added _llseek, _lcreate, GetDriveType, GetTempDrive, 
+ *		- Added _llseek, _lcreat, GetDriveType, GetTempDrive, 
  *		  GetWindowsDirectory, GetSystemDirectory, GetTempFileName.
  *
  ************************************************************************/
@@ -27,7 +27,7 @@
 #include <windows.h>
 #include "prototypes.h"
 
-#define DEBUG_FILE
+/* #define DEBUG_FILE */
 
 char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256];
 
@@ -63,7 +63,7 @@
 /***************************************************************************
  _lread
  ***************************************************************************/
-WORD _lread (INT hFile, LPSTR lpBuffer, INT wBytes)
+INT _lread (INT hFile, LPSTR lpBuffer, INT wBytes)
 {
   int result;
 
@@ -83,7 +83,7 @@
 /****************************************************************************
  _lwrite
 ****************************************************************************/
-WORD _lwrite (INT hFile, LPSTR lpBuffer, INT wBytes)
+INT _lwrite (INT hFile, LPSTR lpBuffer, INT wBytes)
 {
 	int result;
 
@@ -196,15 +196,15 @@
 }
 
 /***************************************************************************
- _lcreate
+ _lcreat
  ***************************************************************************/
-INT _lcreate (LPSTR lpszFilename, INT fnAttribute)
+INT _lcreat (LPSTR lpszFilename, INT fnAttribute)
 {
 	int handle;
 	char *UnixFileName;
 
 #ifdef DEBUG_FILE
-	fprintf(stderr, "_lcreate: filename %s, attributes %d\n",lpszFilename, 
+	fprintf(stderr, "_lcreat: filename %s, attributes %d\n",lpszFilename, 
   			fnAttribute);
 #endif
 	if ((UnixFileName = GetUnixFileName(lpszFilename)) == NULL)
@@ -307,7 +307,7 @@
 	fprintf(stderr,"GetTempFilename: %c %s %d => %s\n",bDriveLetter,
 		lpszPrefixString,uUnique,lpszTempFileName);
 #endif
-	if ((handle = _lcreate (lpszTempFileName, 0x0000)) == -1) {
+	if ((handle = _lcreat (lpszTempFileName, 0x0000)) == -1) {
 		fprintf(stderr,"GetTempFilename: can't create temp file '%s' !\n", lpszTempFileName);
 		}
 	else
diff --git a/misc/mmsystem.c b/misc/mmsystem.c
index 042974c..9332079 100644
--- a/misc/mmsystem.c
+++ b/misc/mmsystem.c
@@ -10,6 +10,8 @@
 #include "win.h"
 #include "mmsystem.h"
 
+static WORD		mciActiveDev = 0;
+
 
 int MCI_LibMain(HANDLE hInstance, WORD wDataSeg,
 		 WORD cbHeapSize, LPSTR lpCmdLine)
@@ -78,6 +80,9 @@
 
 
 
+/**************************************************************************
+* 				mciGetErrorString		[MMSYSTEM.706]
+*/
 BOOL mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT uLength)
 {
 	LPSTR	msgptr;
@@ -331,23 +336,204 @@
 			break;
 		}
 	maxbuf = min(uLength - 1, strlen(msgptr));
-	strncpy(lpstrBuffer, msgptr, maxbuf);
+	if (maxbuf > 0) strncpy(lpstrBuffer, msgptr, maxbuf);
 	lpstrBuffer[maxbuf + 1] = '\0';
 	return(TRUE);
 }
 
 
+/**************************************************************************
+* 				mciWaveOpen					[internal]
+*/
+DWORD mciWaveOpen(UINT wDevID, DWORD dwParam, LPMCI_WAVE_OPEN_PARMS lpParms)
+{
+	if (lpParms == NULL) return MCIERR_INTERNAL;
+	printf("mciWaveOpen(%04X, %08X, %08X)\n", wDevID, dwParam, lpParms);
+	return MCIERR_INTERNAL;
+}
 
+
+/**************************************************************************
+* 				mciOpen					[internal]
+*/
+DWORD mciOpen(UINT wDevID, DWORD dwParam, LPMCI_OPEN_PARMS lpParms)
+{
+	DWORD	dwDevTyp = 0;
+	if (lpParms == NULL) return MCIERR_INTERNAL;
+	printf("mciOpen(%04X, %08X, %08X)\n", wDevID, dwParam, lpParms);
+	if (dwParam & MCI_OPEN_TYPE) {
+		if (lpParms->lpstrDeviceType == NULL) return MCIERR_INTERNAL;
+		if (dwParam & MCI_OPEN_TYPE_ID) {
+			printf("MCI_OPEN // Dev=%08X !\n", lpParms->lpstrDeviceType);
+			dwDevTyp = (DWORD)lpParms->lpstrDeviceType;
+			}
+		else {
+			if (strcmp(lpParms->lpstrDeviceType, "cdaudio") == 0) {
+				dwDevTyp = MCI_DEVTYPE_CD_AUDIO;
+				}
+			else
+			if (strcmp(lpParms->lpstrDeviceType, "waveaudio") == 0) {
+				dwDevTyp = MCI_DEVTYPE_WAVEFORM_AUDIO;
+				}
+			else
+			if (strcmp(lpParms->lpstrDeviceType, "Sequencer") == 0)	{
+				dwDevTyp = MCI_DEVTYPE_SEQUENCER;
+				}
+			else
+			if (strcmp(lpParms->lpstrDeviceType, "Animation1") == 0) {
+				dwDevTyp = MCI_DEVTYPE_ANIMATION;
+				}
+			}
+		switch(dwDevTyp) {
+			case MCI_DEVTYPE_CD_AUDIO:
+				printf("MCI_OPEN // No SEQUENCER yet !\n");
+				return MCIERR_DEVICE_NOT_INSTALLED;
+			case MCI_DEVTYPE_WAVEFORM_AUDIO:
+				printf("MCI_OPEN // No WAVEAUDIO yet !\n");
+				return MCIERR_DEVICE_NOT_INSTALLED;
+			case MCI_DEVTYPE_SEQUENCER:
+				printf("MCI_OPEN // No SEQUENCER yet !\n");
+				return MCIERR_DEVICE_NOT_INSTALLED;
+			case MCI_DEVTYPE_ANIMATION:
+				printf("MCI_OPEN // No ANIMATION yet !\n");
+				return MCIERR_DEVICE_NOT_INSTALLED;
+			case MCI_DEVTYPE_DIGITAL_VIDEO:
+				printf("MCI_OPEN // No DIGITAL_VIDEO yet !\n");
+				return MCIERR_DEVICE_NOT_INSTALLED;
+			default:
+				printf("MCI_OPEN // Invalid Device Name '%08X' !\n", lpParms->lpstrDeviceType);
+				return MCIERR_INVALID_DEVICE_NAME;
+			}
+		lpParms->wDeviceID = ++mciActiveDev;
+		printf("MCI_OPEN // wDeviceID=%04X !\n", lpParms->wDeviceID);
+		return 0;
+		}
+	if (dwParam & MCI_OPEN_ELEMENT) {
+		printf("MCI_OPEN // Element !\n");
+		printf("MCI_OPEN // Elem=%s' !\n", lpParms->lpstrElementName);
+		}
+	return MCIERR_INTERNAL;
+}
+
+
+/**************************************************************************
+* 				mciSound				[internal]
+*/
+DWORD mciSound(UINT wDevID, DWORD dwParam, LPMCI_SOUND_PARMS lpParms)
+{
+	if (lpParms == NULL) return MCIERR_INTERNAL;
+	if (dwParam & MCI_SOUND_NAME)
+		printf("MCI_SOUND // file='%s' !\n", lpParms->lpstrSoundName);
+	return MCIERR_INVALID_DEVICE_ID;
+}
+
+
+/**************************************************************************
+* 				mciGetDevCaps			[internal]
+*/
+DWORD mciGetDevCaps(UINT wDevID, DWORD dwParam, LPMCI_GETDEVCAPS_PARMS lpParms)
+{
+	if (lpParms == NULL) return MCIERR_INTERNAL;
+	lpParms->dwReturn = 0;
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mciInfo					[internal]
+*/
+DWORD mciInfo(UINT wDevID, DWORD dwParam, LPMCI_INFO_PARMS lpParms)
+{
+	if (lpParms == NULL) return MCIERR_INTERNAL;
+	lpParms->lpstrReturn = NULL;
+	lpParms->dwRetSize = 0;
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mciStatus				[internal]
+*/
+DWORD mciStatus(UINT wDevID, DWORD dwParam, LPMCI_STATUS_PARMS lpParms)
+{
+	if (lpParms == NULL) return MCIERR_INTERNAL;
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mciPlay					[internal]
+*/
+DWORD mciPlay(UINT wDevID, DWORD dwParam, LPMCI_PLAY_PARMS lpParms)
+{
+	if (lpParms == NULL) return MCIERR_INTERNAL;
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mciRecord				[internal]
+*/
+DWORD mciRecord(UINT wDevID, DWORD dwParam, LPMCI_RECORD_PARMS lpParms)
+{
+	if (lpParms == NULL) return MCIERR_INTERNAL;
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mciClose				[internal]
+*/
+DWORD mciClose(UINT wDevID)
+{
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mciSendCommand			[MMSYSTEM.701]
+*/
 DWORD mciSendCommand(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2)
 {
 	printf("mciSendCommand(%04X, %04X, %08X, %08X)\n", 
 					wDevID, wMsg, dwParam1, dwParam2);
+	switch(wMsg) {
+		case MCI_OPEN:
+			printf("mciSendCommand // MCI_OPEN !\n");
+			if (dwParam1 & MCI_WAVE_OPEN_BUFFER)
+				return mciWaveOpen(wDevID, dwParam1, 
+					(LPMCI_WAVE_OPEN_PARMS)dwParam2);
+			else
+				return mciOpen(wDevID, dwParam1, (LPMCI_OPEN_PARMS)dwParam2);
+		case MCI_PLAY:
+			printf("mciSendCommand // MCI_PLAY !\n");
+			return mciPlay(wDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);
+		case MCI_RECORD:
+			printf("mciSendCommand // MCI_RECORD !\n");
+			return mciRecord(wDevID, dwParam1, (LPMCI_RECORD_PARMS)dwParam2);
+		case MCI_CLOSE:
+			printf("mciSendCommand // MCI_CLOSE !\n");
+			return mciClose(wDevID);
+		case MCI_SOUND:
+			printf("mciSendCommand // MCI_SOUND !\n");
+			return mciSound(wDevID, dwParam1, (LPMCI_SOUND_PARMS)dwParam2);
+		case MCI_STATUS:
+			printf("mciSendCommand // MCI_STATUS !\n");
+			return mciStatus(wDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);
+		case MCI_INFO:
+			printf("mciSendCommand // MCI_INFO !\n");
+			return mciInfo(wDevID, dwParam1, (LPMCI_INFO_PARMS)dwParam2);
+		case MCI_GETDEVCAPS:
+			printf("mciSendCommand // MCI_GETDEVCAPS !\n");
+			return mciGetDevCaps(wDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
+		}
 	return MCIERR_DEVICE_NOT_INSTALLED;
 }
 
 
-
-
+/**************************************************************************
+* 				mciGetDeviceID			[MMSYSTEM.703]
+*/
 UINT mciGetDeviceID (LPCSTR lpstrName)
 {
 	printf("mciGetDeviceID(%s)\n", lpstrName);
@@ -356,6 +542,9 @@
 
 
 
+/**************************************************************************
+* 				mciSendString			[MMSYSTEM.702]
+*/
 DWORD WINAPI mciSendString (LPCSTR lpstrCommand,
     LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
 {
@@ -483,7 +672,7 @@
 			break;
 		}
 	maxbuf = min(uSize - 1, strlen(msgptr));
-	strncpy(lpText, msgptr, maxbuf);
+	if (maxbuf > 0) strncpy(lpText, msgptr, maxbuf);
 	lpText[maxbuf + 1] = '\0';
 	return(TRUE);
 }
@@ -493,6 +682,7 @@
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	printf("midiOutOpen\n");
+	if (lphMidiOut != NULL) *lphMidiOut = 0;
 	return 0;
 }
 
@@ -603,6 +793,7 @@
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	printf("midiInOpen\n");
+	if (lphMidiIn != NULL) *lphMidiIn = 0;
 	return 0;
 }
 
@@ -698,65 +889,68 @@
 
 UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
-   if ((lpText == NULL) || (uSize < 1)) return(FALSE);
-   lpText[0] = '\0';
-   switch(uError)
-      {
-      case MMSYSERR_NOERROR:
-         sprintf(lpText, "The specified command was carried out.");
-         break;
-      case MMSYSERR_ERROR:
-         sprintf(lpText, "Undefined external error.");
-         break;
-      case MMSYSERR_BADDEVICEID:
-         sprintf(lpText, "A device ID has been used that is out of range for your system.");
-         break;
-      case MMSYSERR_NOTENABLED:
-         sprintf(lpText, "The driver was not enabled.");
-         break;
-      case MMSYSERR_ALLOCATED:
-         sprintf(lpText, "The specified device is already in use. Wait until it is free, and then try again.");
-         break;
-      case MMSYSERR_INVALHANDLE:
-         sprintf(lpText, "The specified device handle is invalid.");
-         break;
-      case MMSYSERR_NODRIVER:
-         sprintf(lpText, "There is no driver installed on your system !\n");
-         break;
-      case MMSYSERR_NOMEM:
-         sprintf(lpText, "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.");
-         break;
-      case MMSYSERR_NOTSUPPORTED:
-         sprintf(lpText, "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.");
-         break;
-      case MMSYSERR_BADERRNUM:
-         sprintf(lpText, "An error number was specified that is not defined in the system.");
-         break;
-      case MMSYSERR_INVALFLAG:
-         sprintf(lpText, "An invalid flag was passed to a system function.");
-         break;
-      case MMSYSERR_INVALPARAM:
-         sprintf(lpText, "An invalid parameter was passed to a system function.");
-         break;
-      case WAVERR_BADFORMAT:
-         sprintf(lpText, "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats");
-         break;
-      case WAVERR_STILLPLAYING:
-         sprintf(lpText, "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.");
-         break;
-      case WAVERR_UNPREPARED:
-         sprintf(lpText, "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.");
-         break;
-      case WAVERR_SYNC:
-         sprintf(lpText, "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.");
-         break;
-         
-      default:
-         sprintf(lpText, "Unkown MMSYSTEM Error !\n");
-         break;
-      }
-   lpText[uSize - 1] = '\0';
-   return(TRUE);
+	LPSTR	msgptr;
+	int		maxbuf;
+	printf("waveGetErrorText(%04X, %08X, %d);\n", uError, lpText, uSize);
+	if ((lpText == NULL) || (uSize < 1)) return(FALSE);
+	lpText[0] = '\0';
+	switch(uError) {
+		case MMSYSERR_NOERROR:
+			msgptr = "The specified command was carried out.";
+			break;
+		case MMSYSERR_ERROR:
+			msgptr = "Undefined external error.";
+			break;
+		case MMSYSERR_BADDEVICEID:
+			msgptr = "A device ID has been used that is out of range for your system.";
+			break;
+		case MMSYSERR_NOTENABLED:
+			msgptr = "The driver was not enabled.";
+			break;
+		case MMSYSERR_ALLOCATED:
+			msgptr = "The specified device is already in use. Wait until it is free, and then try again.";
+			break;
+		case MMSYSERR_INVALHANDLE:
+			msgptr = "The specified device handle is invalid.";
+			break;
+		case MMSYSERR_NODRIVER:
+			msgptr = "There is no driver installed on your system !\n";
+			break;
+		case MMSYSERR_NOMEM:
+			msgptr = "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again.";
+			break;
+		case MMSYSERR_NOTSUPPORTED:
+			msgptr = "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports.";
+			break;
+		case MMSYSERR_BADERRNUM:
+			msgptr = "An error number was specified that is not defined in the system.";
+			break;
+		case MMSYSERR_INVALFLAG:
+			msgptr = "An invalid flag was passed to a system function.";
+			break;
+		case MMSYSERR_INVALPARAM:
+			msgptr = "An invalid parameter was passed to a system function.";
+			break;
+		case WAVERR_BADFORMAT:
+			msgptr = "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats";
+			break;
+		case WAVERR_STILLPLAYING:
+			msgptr = "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing.";
+			break;
+		case WAVERR_UNPREPARED:
+			msgptr = "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again.";
+			break;
+		case WAVERR_SYNC:
+			msgptr = "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again.";
+			break;
+		default:
+			msgptr = "Unkown MMSYSTEM Error !\n";
+			break;
+		}
+	maxbuf = min(uSize - 1, strlen(msgptr));
+	if (maxbuf > 0) strncpy(lpText, msgptr, maxbuf);
+	lpText[maxbuf + 1] = '\0';
+	return(TRUE);
 }
 
 
@@ -764,6 +958,7 @@
     const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 printf("waveOutOpen\n");
+if (lphWaveOut != NULL) *lphWaveOut = 0;
 return 0;
 }
 
@@ -920,6 +1115,7 @@
     const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 printf("waveInOpen\n");
+if (lphWaveIn != NULL) *lphWaveIn = 0;
 return 0;
 }
 
diff --git a/misc/property.c b/misc/property.c
index 55abcb9..3ce34c8 100644
--- a/misc/property.c
+++ b/misc/property.c
@@ -45,7 +45,10 @@
 	lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
 	if (lpProp == NULL) return 0;
 	while (TRUE) {
-		if (strcmp(lpProp->PropName, lpStr) == 0) {
+		if ((((DWORD)lpStr & 0xFFFF0000) == 0L && 
+			lpProp->Atom == LOWORD((DWORD)lpStr)) ||
+			(((DWORD)lpStr & 0xFFFF0000) != 0L && 
+			strcmp(lpProp->PropName, lpStr) == 0)) {
 		   	printf("RemoveProp // Property found ! hData=%04X\n", lpProp->hData);
 			hOldData = lpProp->hData;
 			if (lpProp->lpPrevProp != NULL) 
@@ -54,7 +57,7 @@
 			if (lpProp->lpNextProp != NULL) 
 				((LPPROPENTRY)lpProp->lpNextProp)->lpPrevProp = 
 											lpProp->lpPrevProp;
-			free(lpProp->PropName);
+			if (lpProp->PropName != NULL) free(lpProp->PropName);
 			free(lpProp);
 			GlobalUnlock(wndPtr->hProp);
 			return hOldData;
@@ -84,7 +87,7 @@
 	wndPtr = WIN_FindWndPtr(hWnd);
     if (wndPtr == NULL) {
     	printf("GetProp // Bad Window handle !\n");
-    	return FALSE;
+    	return 0;
     	}
 	lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
 	if (lpProp == NULL) return 0;
@@ -130,7 +133,10 @@
 	lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
 	if (lpProp != NULL) {
 		while (TRUE) {
-			if (strcmp(lpProp->PropName, lpStr) == 0) {
+			if ((((DWORD)lpStr & 0xFFFF0000) == 0L && 
+				lpProp->Atom == LOWORD((DWORD)lpStr)) ||
+				(((DWORD)lpStr & 0xFFFF0000) != 0L && 
+				strcmp(lpProp->PropName, lpStr) == 0)) {
 #ifdef DEBUG_PROP
 			    printf("SetProp // change already exinsting property !\n");
 #endif
@@ -190,8 +196,39 @@
  */
 int EnumProps(HWND hWnd, FARPROC lpEnumFunc)
 {
-	printf("EMPTY STUB !!! EnumProps(%04X, %08X)\n", hWnd, lpEnumFunc);
-	return -1;
+    WND 		*wndPtr;
+	LPPROPENTRY lpProp;
+	LPSTR		str;
+	int			nRet;
+	printf("EnumProps(%04X, %08X)\n", hWnd, lpEnumFunc);
+	wndPtr = WIN_FindWndPtr(hWnd);
+    if (wndPtr == NULL) {
+    	printf("EnumProps // Bad Window handle !\n");
+    	return 0;
+    	}
+	lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
+	if (lpProp == NULL) return 0;
+	if (lpEnumFunc != NULL)	return 0;
+	while (TRUE) {
+    	printf("EnumProps // lpProp->Atom=%04X !\n", lpProp->Atom);
+		str = (LPSTR)MAKELONG(lpProp->Atom, 0); 
+		if (lpProp->PropName != NULL) {
+	    	printf("EnumProps // lpProp->PropName='%s' !\n", lpProp->PropName);
+			str = lpProp->PropName; 
+			}
+#ifdef WINELIB
+		nRet = (*lpEnumFunc)((HWND)hWnd, (WORD)0, 
+			(LPSTR)str, (HANDLE)lpProp->hData);
+#else
+		nRet = CallBack16(lpEnumFunc, 4, (HANDLE)lpProp->hData, 
+							(LPSTR)str, (WORD)0, (HWND)hWnd);
+#endif
+		if (nRet == 0) break;
+		if (lpProp->lpNextProp == NULL) break;
+		lpProp = lpProp->lpNextProp;
+		}
+	GlobalUnlock(wndPtr->hProp);
+	return 0;
 }
 
 
diff --git a/misc/shell.c b/misc/shell.c
index bb86353..779c595 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -134,30 +134,7 @@
 }
 
 char AppName[256], AppMisc[256];
-
-/*************************************************************************
- *				AboutDlgProc		[SHELL.33]
- */
-INT AboutDlgProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam)
-{
-	char temp[256];
-
-	switch(msg) {
-        case WM_INITDIALOG:
-		sprintf(temp, "About %s", AppName);
-/*		SetDlgItemText(hWnd, 0, temp);*/
-		SetDlgItemText(hWnd, 100, AppMisc);
-		break;
-
-        case WM_COMMAND:
-		switch (wParam) {
-		case IDOK:
-			EndDialog(hWnd, TRUE);
-			return TRUE;
-		}
-	}
-	return FALSE;
-}
+INT AboutDlgProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam);
 
 /*************************************************************************
  *				ShellAbout		[SHELL.22]
@@ -174,6 +151,30 @@
 
 
 /*************************************************************************
+ *				AboutDlgProc		[SHELL.33]
+ */
+INT AboutDlgProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam)
+{
+	char temp[256];
+
+	switch(msg) {
+        case WM_INITDIALOG:
+		sprintf(temp, "About %s", AppName);
+		SetWindowText(hWnd, temp);
+		SetDlgItemText(hWnd, 100, AppMisc);
+		break;
+
+        case WM_COMMAND:
+		switch (wParam) {
+		case IDOK:
+			EndDialog(hWnd, TRUE);
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+/*************************************************************************
  *				ExtractIcon		[SHELL.34]
  */
 HICON ExtractIcon(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex)
diff --git a/misc/winsocket.c b/misc/winsocket.c
index cc361f6..4d9d5c0 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -549,8 +549,12 @@
 /******************** winsock specific functions ************************
  *
  */
+static HANDLE new_handle = 0;
 
-#define AllocWSAHandle() getpid()
+HANDLE AllocWSAHandle(void)
+{
+	return new_handle++;
+}
 
 static void recv_message(int sig)
 {
diff --git a/objects/Imakefile b/objects/Imakefile
index bce8061..b39ccd2 100644
--- a/objects/Imakefile
+++ b/objects/Imakefile
@@ -17,7 +17,8 @@
 	bitblt.c \
 	linedda.c \
 	color.c \
-	dither.c
+	dither.c \
+	metafile.c
 
 OBJS = \
 	bitmap.o \
@@ -34,7 +35,8 @@
 	bitblt.o \
 	linedda.o \
 	color.o \
-	dither.o
+	dither.o \
+	metafile.o
 
 WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
 DependTarget()
diff --git a/objects/brush.c b/objects/brush.c
index 9464184..563617f 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -9,6 +9,7 @@
 #include "gdi.h"
 #include "bitmap.h"
 #include "prototypes.h"
+#include "metafile.h"
 
 
 #define NB_HATCH_STYLES  6
@@ -228,6 +229,26 @@
     HBITMAP hBitmap;
     BITMAPINFO * bmpInfo;
     HBRUSH prevHandle = dc->w.hBrush;
+
+    if (dc->header.wMagic == METAFILE_DC_MAGIC)
+    {
+	switch (brush->logbrush.lbStyle)
+	{
+	case BS_SOLID:
+	case BS_HATCHED:
+	case BS_HOLLOW:
+	    if (!MF_CreateBrushIndirect(dc, &(brush->logbrush)))
+		return 0;
+	    break;
+
+	case BS_PATTERN:
+	case BS_DIBPATTERN:
+	    if (!MF_CreatePatternBrush(dc, &(brush->logbrush)))
+		return 0;
+	    break;
+	}
+	return 1;
+    }
     
     dc->w.hBrush = hbrush;
 
diff --git a/objects/dcvalues.c b/objects/dcvalues.c
index 12b775f..33b51ac 100644
--- a/objects/dcvalues.c
+++ b/objects/dcvalues.c
@@ -7,6 +7,7 @@
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
 #include "gdi.h"
+#include "metafile.h"
 
   /* Default DC values */
 const WIN_DC_INFO DCVAL_defaultValues =
@@ -96,25 +97,33 @@
     return prevVal; \
 }
 
-#define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \
+#define DC_SET_MODE( func_name, dc_field, min_val, max_val, meta_func ) \
 WORD func_name( HDC hdc, WORD mode ) \
 { \
     WORD prevMode; \
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); \
-    if (!dc) return 0; \
     if ((mode < min_val) || (mode > max_val)) return 0; \
+    if (!dc) { \
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); \
+	if (!dc) return 0; \
+	MF_MetaParam1(dc, meta_func, mode); \
+	return 1; \
+    } \
     prevMode = dc->w.dc_field; \
     dc->w.dc_field = mode; \
     return prevMode; \
 }
 
 
-DC_SET_MODE( SetBkMode, backgroundMode, TRANSPARENT, OPAQUE )     /* GDI.2 */
-DC_SET_MODE( SetROP2, ROPmode, R2_BLACK, R2_WHITE )               /* GDI.4 */
-DC_SET_MODE( SetRelAbs, relAbsMode, ABSOLUTE, RELATIVE )          /* GDI.5 */
-DC_SET_MODE( SetPolyFillMode, polyFillMode, ALTERNATE, WINDING )  /* GDI.6 */
+DC_SET_MODE( SetBkMode, backgroundMode, TRANSPARENT, OPAQUE,
+	     META_SETBKMODE )                                     /* GDI.2 */
+DC_SET_MODE( SetROP2, ROPmode, R2_BLACK, R2_WHITE, META_SETROP2 ) /* GDI.4 */
+DC_SET_MODE( SetRelAbs, relAbsMode, ABSOLUTE, RELATIVE,
+	     META_SETRELABS )                                     /* GDI.5 */
+DC_SET_MODE( SetPolyFillMode, polyFillMode, ALTERNATE, WINDING,
+	     META_SETPOLYFILLMODE )                               /* GDI.6 */
 DC_SET_MODE( SetStretchBltMode, stretchBltMode,
-	     BLACKONWHITE, COLORONCOLOR )                         /* GDI.7 */
+	     BLACKONWHITE, COLORONCOLOR, META_SETSTRETCHBLTMODE ) /* GDI.7 */
 DC_GET_VAL( COLORREF, GetBkColor, backgroundColor )               /* GDI.75 */
 DC_GET_VAL( WORD, GetBkMode, backgroundMode )                     /* GDI.76 */
 DC_GET_X_Y( DWORD, GetCurrentPosition, CursPosX, CursPosY )       /* GDI.78 */
diff --git a/objects/font.c b/objects/font.c
index b346d8a..2ff21c5 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -10,6 +10,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <X11/Xatom.h>
+#include "user.h"
 #include "gdi.h"
 
 
@@ -414,7 +415,7 @@
     for (i = wFirstChar, j = 0; i <= wLastChar; i++, j++)
     {
 	CI_GET_CHAR_INFO(xfont, i, def, cs);
-	*(lpBuffer + j) = cs->width;
+	*(lpBuffer + j) = cs ? cs->width : xfont->max_bounds.width;
 	if (*(lpBuffer + j) < 0)
 	    *(lpBuffer + j) = 0;
     }
@@ -425,11 +426,138 @@
 /*************************************************************************
  *				EnumFonts			[GDI.70]
  */
-int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpFontFunc, LPSTR lpData)
+int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpEnumFunc, LPSTR lpData)
 {
-	printf("EMPTY STUB !!! EnumFonts(%04X, %08X, %08X, %08X)\n", 
-						hDC, lpFaceName, lpFontFunc, lpData);
-	return -1;
+	HANDLE			hLog;
+	HANDLE			hMet;
+	LPLOGFONT		lpLogFont;
+	LPTEXTMETRIC	lptm;
+	int				nRet;
+	printf("EnumFonts(%04X, %08X, %08X, %08X)\n", 
+			hDC, lpFaceName, lpEnumFunc, lpData);
+	if (lpEnumFunc == NULL) return 0;
+	hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGFONT) + LF_FACESIZE);
+	lpLogFont = (LPLOGFONT) USER_HEAP_ADDR(hLog);
+	if (lpLogFont == NULL) {
+		printf("EnumFonts // can't alloc LOGFONT struct !\n");
+		return 0;
+		}
+	hMet = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(TEXTMETRIC));
+	lptm = (LPTEXTMETRIC) USER_HEAP_ADDR(hMet);
+	if (lptm == NULL) {
+		USER_HEAP_FREE(hLog);
+		printf("EnumFonts // can't alloc TEXTMETRIC struct !\n");
+		return 0;
+		}
+	while (TRUE) {
+    	printf("EnumFonts // !\n");
+		lpLogFont->lfHeight = 18;
+		lpLogFont->lfWidth = 12;
+		lpLogFont->lfEscapement = 0;
+		lpLogFont->lfOrientation = 0;
+		lpLogFont->lfWeight = FW_REGULAR;
+		lpLogFont->lfItalic = 0;
+		lpLogFont->lfUnderline = 0;
+		lpLogFont->lfStrikeOut = 0;
+		lpLogFont->lfCharSet = ANSI_CHARSET;
+		lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
+		lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
+		lpLogFont->lfQuality = DEFAULT_QUALITY;
+		lpLogFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
+		strcpy(lpLogFont->lfFaceName, "Courier");
+		printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+#ifdef WINELIB
+		nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
+#else
+		nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
+					2, (int)lptm, 0, (int)0, 2, (int)lpData);
+#endif
+		if (nRet == 0) break;
+		lpLogFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
+		strcpy(lpLogFont->lfFaceName, "Helvetica");
+		printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+#ifdef WINELIB
+		nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
+#else
+		nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
+					2, (int)lptm, 0, (int)0, 2, (int)lpData);
+#endif
+		if (nRet == 0) break;
+		else break;
+		}
+	USER_HEAP_FREE(hMet);
+	USER_HEAP_FREE(hLog);
+	return 0;
+}
+
+
+/*************************************************************************
+ *				EnumFontFamilies	[GDI.330]
+ */
+int EnumFontFamilies(HDC hDC, LPSTR lpszFamily, FARPROC lpEnumFunc, LPSTR lpData)
+{
+	HANDLE			hLog;
+	HANDLE			hMet;
+	LPLOGFONT		lpLogFont;
+	LPTEXTMETRIC	lptm;
+	int				nRet;
+	printf("EnumFontFamilies(%04X, %08X, %08X, %08X)\n", 
+					hDC, lpszFamily, lpEnumFunc, lpData);
+	if (lpEnumFunc == NULL) return 0;
+	hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGFONT) + LF_FACESIZE);
+	lpLogFont = (LPLOGFONT) USER_HEAP_ADDR(hLog);
+	if (lpLogFont == NULL) {
+		printf("EnumFontFamilies // can't alloc LOGFONT struct !\n");
+		return 0;
+		}
+	hMet = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(TEXTMETRIC));
+	lptm = (LPTEXTMETRIC) USER_HEAP_ADDR(hMet);
+	if (lptm == NULL) {
+		USER_HEAP_FREE(hLog);
+		printf("EnumFontFamilies // can't alloc TEXTMETRIC struct !\n");
+		return 0;
+		}
+	while (TRUE) {
+    	printf("EnumFontFamilies // !\n");
+		lpLogFont->lfHeight = 12;
+		lpLogFont->lfWidth = 8;
+		lpLogFont->lfEscapement = 0;
+		lpLogFont->lfOrientation = 0;
+		lpLogFont->lfWeight = FW_REGULAR;
+		lpLogFont->lfItalic = 0;
+		lpLogFont->lfUnderline = 0;
+		lpLogFont->lfStrikeOut = 0;
+		lpLogFont->lfCharSet = ANSI_CHARSET;
+		lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
+		lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
+		lpLogFont->lfQuality = DEFAULT_QUALITY;
+		lpLogFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
+		strcpy(lpLogFont->lfFaceName, "Courier");
+/*		lpLogFont->lfFullName[LF_FACESIZE] = 12;
+		lpLogFont->lfStyle[LF_FACESIZE] = 12; */
+		printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+#ifdef WINELIB
+		nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
+#else
+		nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
+					2, (int)lptm, 0, (int)0, 2, (int)lpData);
+#endif
+		if (nRet == 0) break;
+		lpLogFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
+		strcpy(lpLogFont->lfFaceName, "Helvetica");
+		printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+#ifdef WINELIB
+		nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
+#else
+		nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
+					2, (int)lptm, 0, (int)0, 2, (int)lpData);
+#endif
+		if (nRet == 0) break;
+		else break;
+		}
+	USER_HEAP_FREE(hMet);
+	USER_HEAP_FREE(hLog);
+	return 0;
 }
 
 
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index cd78887..6243fd2 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -356,7 +356,11 @@
     if (!ptr) return 0;
     
     dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return 0;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return 0;
+    }
     
     switch(ptr->wMagic)
     {
diff --git a/objects/pen.c b/objects/pen.c
index 48da252..cf3089f 100644
--- a/objects/pen.c
+++ b/objects/pen.c
@@ -7,6 +7,7 @@
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
 #include "gdi.h"
+#include "metafile.h"
 
 extern WORD COLOR_ToPhysical( DC *dc, COLORREF color );
 
@@ -60,8 +61,11 @@
     static char dash_dot[]        = { 2, 2 };      /* --  --  --  --  --  -- */
     static char dash_dashdot[]    = { 4,3,2,3 };   /* ----   --   ----   --  */
     static char dash_dashdotdot[] = { 4,2,2,2,2,2 };  /* ----  --  --  ----  */
-
     HPEN prevHandle = dc->w.hPen;
+
+    if (dc->header.wMagic == METAFILE_DC_MAGIC)
+	return MF_CreatePenIndirect(dc, &(pen->logpen));
+
     dc->w.hPen = hpen;
 
     dc->u.x.pen.style = pen->logpen.lopnStyle;
diff --git a/objects/text.c b/objects/text.c
index ae01b20..0d9690b 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -9,6 +9,7 @@
 #include <X11/Xatom.h>
 #include "windows.h"
 #include "gdi.h"
+#include "metafile.h"
 
 #define TAB     9
 #define LF     10
@@ -255,7 +256,14 @@
     XFontStruct *font;
 
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return FALSE;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_TextOut(dc, x, y, str, count);
+	return TRUE;
+    }
+
     if (!DC_SetupGCForText( dc )) return TRUE;
     font = dc->u.x.font.fstruct;
 
@@ -403,3 +411,17 @@
 		return s;
 	}
 }
+
+/***********************************************************************
+ *			ExtTextOut			[GDI.351]
+ */
+BOOL ExtTextOut(HDC hDC, short x, short y, WORD wOptions, LPRECT lprect,
+			LPSTR str, WORD count, LPINT lpDx)
+{
+	printf("EMPTY STUB !!! ExtTextOut(); ! (call TextOut() for new)\n");
+	TextOut(hDC, x, y, str, count);
+	return FALSE;
+}
+
+
+
diff --git a/windows/class.c b/windows/class.c
index 68277c6..753ee0d 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -110,6 +110,11 @@
 	if (!(prevClassPtr->wc.style & CS_GLOBALCLASS)) return 0;
     }
 
+      /* bug for bug compatible */
+
+    if (class->cbClsExtra < 0) class->cbClsExtra = 0;
+    if (class->cbWndExtra < 0) class->cbWndExtra = 0;
+
       /* Create class */
 
     handle = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(CLASS)+class->cbClsExtra );
diff --git a/windows/dc.c b/windows/dc.c
index 58dd531..c5cc0c7 100644
--- a/windows/dc.c
+++ b/windows/dc.c
@@ -10,6 +10,7 @@
 #include <string.h>
 #include "gdi.h"
 #include "bitmap.h"
+#include "metafile.h"
 
 static DeviceCaps * displayDevCaps = NULL;
 
@@ -104,6 +105,7 @@
     SelectObject( hdc, dc->w.hFont );
     XSetGraphicsExposures( XT_display, dc->u.x.gc, False );
     CLIPPING_SetDeviceClipping( dc );
+    FONT_SelectObject(dc, STOCK_SYSTEM_FIXED_FONT, NULL);
 }
 
 
@@ -477,7 +479,13 @@
 {
     COLORREF oldColor;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return 0x80000000;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return 0x80000000;
+	MF_MetaParam2(dc, META_SETBKCOLOR, HIWORD(color), LOWORD(color));
+	return 0;  /* ?? */
+    }
 
     oldColor = dc->w.backgroundColor;
     dc->w.backgroundColor = color;
@@ -493,7 +501,13 @@
 {
     COLORREF oldColor;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return 0x80000000;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return 0x80000000;
+	MF_MetaParam2(dc, META_SETTEXTCOLOR, HIWORD(color), LOWORD(color));
+	return 0;  /* ?? */
+    }
 
     oldColor = dc->w.textColor;
     dc->w.textColor = color;
diff --git a/windows/dialog.c b/windows/dialog.c
index 379b0b0..7724084 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -4,6 +4,8 @@
  * Copyright 1993 Alexandre Julliard
  */
 
+#define DEBUG_DIALOG /* */
+
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
 #include <stdlib.h>
@@ -267,6 +269,9 @@
 	return 0;
     }
 
+    ShowWindow(hwnd, SW_SHOWNORMAL);
+    UpdateWindow(hwnd);
+
       /* Create control windows */
 
 #ifdef DEBUG_DIALOG
diff --git a/windows/graphics.c b/windows/graphics.c
index 2594c91..a80d5cf 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -26,7 +26,14 @@
 BOOL LineTo( HDC hdc, short x, short y )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return FALSE;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_MetaParam2(dc, META_LINETO, x, y);
+	return TRUE;
+    }
+
     if (DC_SetupGCForPen( dc ))
 	XDrawLine(XT_display, dc->u.x.drawable, dc->u.x.gc, 
 		  dc->w.DCOrgX + XLPTODP( dc, dc->w.CursPosX ),
@@ -44,9 +51,21 @@
  */
 DWORD MoveTo( HDC hdc, short x, short y )
 {
-    POINT pt;
-    if (MoveToEx( hdc, x, y, &pt )) return pt.x | (pt.y << 16);
-    else return 0;
+    short oldx, oldy;
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_MetaParam2(dc, META_MOVETO, x, y);
+	return 0;
+    }
+
+    oldx = dc->w.CursPosX;
+    oldy = dc->w.CursPosY;
+    dc->w.CursPosX = x;
+    dc->w.CursPosY = y;
+    return oldx | (oldy << 16);
 }
 
 
@@ -81,7 +100,29 @@
     double start_angle, end_angle, diff_angle;
     XPoint points[3];
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return FALSE;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	switch (lines)
+	{
+	case 0:
+	    MF_MetaParam8(dc, META_ARC, left, top, right, bottom,
+			  xstart, ystart, xend, yend);
+	    break;
+
+	case 1:
+	    MF_MetaParam8(dc, META_CHORD, left, top, right, bottom,
+			  xstart, ystart, xend, yend);
+	    break;
+
+	case 2:
+	    MF_MetaParam8(dc, META_PIE, left, top, right, bottom,
+			  xstart, ystart, xend, yend);
+	    break;
+	}
+	return 0;
+    }
 
     left   = XLPTODP( dc, left );
     top    = YLPTODP( dc, top );
@@ -166,7 +207,13 @@
 BOOL Ellipse( HDC hdc, int left, int top, int right, int bottom )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return FALSE;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_MetaParam4(dc, META_ELLIPSE, left, top, right, bottom);
+	return 0;
+    }
 
     left   = XLPTODP( dc, left );
     top    = YLPTODP( dc, top );
@@ -192,7 +239,13 @@
 BOOL Rectangle( HDC hdc, int left, int top, int right, int bottom )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return FALSE;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_MetaParam4(dc, META_RECTANGLE, left, top, right, bottom);
+	return TRUE;
+    }
 
     left   = XLPTODP( dc, left );
     top    = YLPTODP( dc, top );
@@ -219,7 +272,14 @@
 {
     int		x1, y1, x2, y2;
     DC * dc = (DC *) GDI_GetObjPtr(hDC, DC_MAGIC);
-    if (!dc) return FALSE;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hDC, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_MetaParam6(dc, META_ROUNDRECT, left, top, right, bottom,
+		      ell_width, ell_height);
+	return TRUE;
+    }
 /*
     printf("RoundRect(%d %d %d %d  %d %d\n", 
     	left, top, right, bottom, ell_width, ell_height);
@@ -350,7 +410,13 @@
     PALETTEENTRY entry;
     
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return 0;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return 0;
+	MF_MetaParam4(dc, META_SETPIXEL, x, y, HIWORD(color), LOWORD(color)); 
+	return 1;
+    }
 
     x = dc->w.DCOrgX + XLPTODP( dc, x );
     y = dc->w.DCOrgY + YLPTODP( dc, y );
@@ -522,25 +588,32 @@
  */
 BOOL Polyline (HDC hdc, LPPOINT pt, int count)
 {
-	register int i;
-    	DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    register int i;
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_MetaPoly(dc, META_POLYLINE, pt, count); 
+	return TRUE;
+    }
 
-    	if (DC_SetupGCForPen( dc ))
-    	{
-		for (i = 0; i < count-1; i ++)
-			XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,  
-				   dc->w.DCOrgX + XLPTODP(dc, pt [i].x),
-				   dc->w.DCOrgY + YLPTODP(dc, pt [i].y),
-				   dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x),
-				   dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y));
-		XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,  
-			   dc->w.DCOrgX + XLPTODP(dc, pt [count-1].x),
-			   dc->w.DCOrgY + YLPTODP(dc, pt [count-1].y),
-			   dc->w.DCOrgX + XLPTODP(dc, pt [0].x),
-			   dc->w.DCOrgY + YLPTODP(dc, pt [0].y));
-	} 
+    if (DC_SetupGCForPen( dc ))
+    {
+	for (i = 0; i < count-1; i ++)
+	    XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,  
+		       dc->w.DCOrgX + XLPTODP(dc, pt [i].x),
+		       dc->w.DCOrgY + YLPTODP(dc, pt [i].y),
+		       dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x),
+		       dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y));
+	XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,  
+		   dc->w.DCOrgX + XLPTODP(dc, pt [count-1].x),
+		   dc->w.DCOrgY + YLPTODP(dc, pt [count-1].y),
+		   dc->w.DCOrgX + XLPTODP(dc, pt [0].x),
+		   dc->w.DCOrgY + YLPTODP(dc, pt [0].y));
+    } 
 	
-	return (TRUE);
+    return (TRUE);
 }
 
 
@@ -549,31 +622,39 @@
  */
 BOOL Polygon (HDC hdc, LPPOINT pt, int count)
 {
-	register int i;
-    	DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-	XPoint *points = (XPoint *) malloc (sizeof (XPoint) * count+1);
+    register int i;
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    XPoint *points = (XPoint *) malloc (sizeof (XPoint) * count+1);
 
-    	if (DC_SetupGCForBrush( dc ))
-    	{
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_MetaPoly(dc, META_POLYGON, pt, count); 
+	return TRUE;
+    }
+
+    if (DC_SetupGCForBrush( dc ))
+    {
     		
-		for (i = 0; i < count; i++)
-		{
-			points [i].x = dc->w.DCOrgX + XLPTODP(dc, pt [i].x);
-			points [i].y = dc->w.DCOrgY + YLPTODP(dc, pt [i].y);
-		}
-		points [count] = points [0];
-		
-		XFillPolygon( XT_display, dc->u.x.drawable, dc->u.x.gc,
-		  	points, count, Complex, CoordModeOrigin);
-		
-		if (DC_SetupGCForPen ( dc ))
-		{
-		    XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
-			        points, count, CoordModeOrigin );
-		}
+	for (i = 0; i < count; i++)
+	{
+	    points [i].x = dc->w.DCOrgX + XLPTODP(dc, pt [i].x);
+	    points [i].y = dc->w.DCOrgY + YLPTODP(dc, pt [i].y);
 	}
-    	free ((void *) points);
-	return (TRUE);
+	points [count] = points [0];
+		
+	XFillPolygon( XT_display, dc->u.x.drawable, dc->u.x.gc,
+		     points, count, Complex, CoordModeOrigin);
+		
+	if (DC_SetupGCForPen ( dc ))
+	{
+	    XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
+		       points, count, CoordModeOrigin );
+	}
+    }
+    free ((void *) points);
+    return (TRUE);
 }
 
 /**********************************************************************
@@ -619,51 +700,57 @@
  */
 BOOL FloodFill(HDC hdc, short x, short y, DWORD crColor)
 {
-	Pixel boundrypixel;
-	int imagex, imagey;
-	XImage *image;
-    	DC *dc;
+    Pixel boundrypixel;
+    int imagex, imagey;
+    XImage *image;
+    DC *dc;
 
 #ifdef DEBUG_GRAPHICS
-	printf("FloodFill %x %d,%d %x\n", hdc, x, y, crColor);
+    printf("FloodFill %x %d,%d %x\n", hdc, x, y, crColor);
 #endif
-    	dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
-
-	if (!dc) return 0;
-
-	x = dc->w.DCOrgX + XLPTODP(dc, x);
-	y = dc->w.DCOrgY + YLPTODP(dc, y);
-
-	if (x < dc->w.DCOrgX || x > dc->w.DCOrgX + dc->w.DCSizeX ||
-	    y < dc->w.DCOrgY || y > dc->w.DCOrgY + dc->w.DCSizeY)
-		return 0;
-
-    	if (!DC_SetupGCForBrush(dc)) 
-		return FALSE;
-
-	boundrypixel = GetNearestPaletteIndex( dc->w.hPalette, crColor );	
-
-	image = XGetImage(display, dc->u.x.drawable,  
-			dc->w.DCOrgX, dc->w.DCOrgY,
-			dc->w.DCSizeX, dc->w.DCSizeY, AllPlanes, ZPixmap);
-	if (XGetPixel(image, x, y) == boundrypixel) 
-		return FALSE;
-	if (!FloodFill_rec(image, x, y, 
-				0,0, 
-				dc->w.DCOrgX + dc->w.DCSizeX, 
-				dc->w.DCOrgY + dc->w.DCSizeY, 
-				boundrypixel, dc->u.x.brush.pixel)) {
-		XDestroyImage(image);
-		return 0;
-	}
-
-	XPutImage(display, dc->u.x.drawable, dc->u.x.gc, image,
-			0, 0,
-			dc->w.DCOrgX, dc->w.DCOrgY,
-                        dc->w.DCSizeX, dc->w.DCSizeY);
-	XDestroyImage(image);
-
+    dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	MF_MetaParam4(dc, META_FLOODFILL, x, y, HIWORD(crColor), 
+		      LOWORD(crColor)); 
 	return TRUE;
+    }
+
+    x = dc->w.DCOrgX + XLPTODP(dc, x);
+    y = dc->w.DCOrgY + YLPTODP(dc, y);
+
+    if (x < dc->w.DCOrgX || x > dc->w.DCOrgX + dc->w.DCSizeX ||
+	y < dc->w.DCOrgY || y > dc->w.DCOrgY + dc->w.DCSizeY)
+	return FALSE;
+
+    if (!DC_SetupGCForBrush(dc)) 
+	return FALSE;
+
+    boundrypixel = GetNearestPaletteIndex( dc->w.hPalette, crColor );	
+
+    image = XGetImage(display, dc->u.x.drawable,  
+		      dc->w.DCOrgX, dc->w.DCOrgY,
+		      dc->w.DCSizeX, dc->w.DCSizeY, AllPlanes, ZPixmap);
+    if (XGetPixel(image, x, y) == boundrypixel) 
+	return FALSE;
+    if (!FloodFill_rec(image, x, y, 
+		       0, 0, 
+		       dc->w.DCOrgX + dc->w.DCSizeX, 
+		       dc->w.DCOrgY + dc->w.DCSizeY, 
+		       boundrypixel, dc->u.x.brush.pixel)) {
+	XDestroyImage(image);
+	return FALSE;
+    }
+
+    XPutImage(display, dc->u.x.drawable, dc->u.x.gc, image,
+	      0, 0,
+	      dc->w.DCOrgX, dc->w.DCOrgY,
+	      dc->w.DCSizeX, dc->w.DCSizeY);
+    XDestroyImage(image);
+
+    return TRUE;
 }
 
 
diff --git a/windows/mapping.c b/windows/mapping.c
index e361a0f..b7a4753 100644
--- a/windows/mapping.c
+++ b/windows/mapping.c
@@ -7,6 +7,7 @@
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
 #include "gdi.h"
+#include "metafile.h"
 
 
 /***********************************************************************
@@ -75,7 +76,13 @@
 {
     WORD prevMode;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) return 0;
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return 0;
+	MF_MetaParam1(dc, META_SETMAPMODE, mode);
+	return 1;
+    }
 
 #ifdef DEBUG_GDI
     printf( "SetMapMode: %d %d\n", hdc, mode );
diff --git a/windows/utility.c b/windows/utility.c
index 00e1683..c16616d 100644
--- a/windows/utility.c
+++ b/windows/utility.c
@@ -52,7 +52,7 @@
 int
 DebugPrintString(char *str)
 {
-    printf("%s", str);
+    fprintf(stderr, "%s", str);
     return 0;
 }
 
@@ -78,7 +78,7 @@
 static void UTILITY_qualify(const char *source, char *dest)
 {
 #ifdef debug_utility
-	printf("UTILITY_qualify(\"%s\", \"%s\");\n", source, dest);
+	fprintf(stderr, "UTILITY_qualify(\"%s\", \"%s\");\n", source, dest);
 #endif
 	if(!source) return;	/* Dumbass attack! */
 	while(*source) {
@@ -130,7 +130,7 @@
 		if(*format) {
 			char modifier = ' ';
 #ifdef debug_utility
-			printf("found:\t\"%%");
+			fprintf(stderr, "found:\t\"%%");
 #endif
 			format++;		/* skip past '%' */
 			/* First skip the flags, field width, etc. */
@@ -138,39 +138,39 @@
 			if ((*format == '#') || (*format == '-') || (*format == '+')
 				|| (*format == ' ')) {
 #ifdef debug_utility
-				printf("%c", *format);
+				fprintf(stderr, "%c", *format);
 #endif
 				format++;
 			}
 			/* Now the field width, etc. */
 			while(isdigit(*format)) {
 #ifdef debug_utility
-				printf("%c", *format);
+				fprintf(stderr, "%c", *format);
 #endif
 				format++;
 			}
 			if(*format == '.') {
 #ifdef debug_utility
-				printf("%c", *format);
+				fprintf(stderr, "%c", *format);
 #endif
 				format++;
 			}
 			while(isdigit(*format)) {
 #ifdef debug_utility
-				printf("%c", *format);
+				fprintf(stderr, "%c", *format);
 #endif
 				format++;
 			}
 			/* Now we handle the rest */
 			if((*format == 'h') || (*format == 'l') || (*format == 'L')) {
 #ifdef debug_utility
-				printf("%c", modifier);
+				fprintf(stderr, "%c", modifier);
 #endif
 				modifier = *(format++);
 			}
 			/* Handle the actual type. */
 #ifdef debug_utility
-				printf("%c\"\n", *format);
+				fprintf(stderr, "%c\"\n", *format);
 #endif
 			switch(*format) {
 				case 'd':
@@ -200,7 +200,7 @@
 	};
 #undef INT_SIZE
 #ifdef debug_utility
-	printf("UTILITY_argsize: returning %i\n", size);
+	fprintf(stderr, "UTILITY_argsize: returning %i\n", size);
 #endif
 	return size;
 };
@@ -228,7 +228,7 @@
 		if(*format) {
 			char modifier = ' ';
 #ifdef debug_utility
-			printf("found:\t\"%%");
+			fprintf(stderr, "found:\t\"%%");
 #endif
 			format++;		/* skip past '%' */
 			/* First skip the flags, field width, etc. */
@@ -244,7 +244,7 @@
 				modifier = *(format++);
 			/* Handle the actual type. */
 #ifdef debug_utility
-				printf("%c\"\n", *format);
+				fprintf(stderr, "%c\"\n", *format);
 #endif
 			switch(*format) {
 				case 'd':
@@ -282,18 +282,132 @@
 	return result;
 };
 
+#ifndef WINELIB
+INT windows_wsprintf(BYTE *win_stack)
+{
+	LPSTR lpOutput, lpFormat;
+	BYTE *new_stack, *stack_ptr, *ptr;
+	int stacklength, result;
+
+	lpOutput = (LPSTR) *(DWORD*)win_stack;
+	win_stack += 4;
+	lpFormat = (LPSTR) *(DWORD*)win_stack;
+	win_stack += 4;
+
+	/* determine # of bytes pushed on 16-bit stack by checking printf's
+	   format string */
+	
+	ptr = lpFormat;
+	stacklength = 0;
+	do {
+		if (*ptr++ != '%')
+			continue;
+
+		/* skip width/precision */
+		while (	*ptr == '-' || *ptr == '+' || *ptr == '.' ||
+			*ptr == ' ' || isdigit(*ptr))
+			ptr++;
+
+		switch(*ptr++) {
+			case 'l': ptr++; /* skip next type character */
+				stacklength += 4;
+				continue;
+			case 's':
+				stacklength += 4;
+				continue;
+			case 'c':
+			case 'd':
+			case 'i':
+			case 'u':
+			case 'x':
+			case 'X':
+				stacklength += 2;
+				continue;
+			default:
+				fprintf(stderr, "wsprintf: oops, unknown formattype `%c' used!\n", *ptr);
+		}
+	} while (*ptr);
+
+	/* create 32-bit stack for libc's vsprintf() */
+
+	new_stack = malloc(2 * stacklength); 
+	stack_ptr = new_stack + 2 * stacklength;
+	win_stack += stacklength;
+	ptr  = lpFormat;
+	do {
+		if (*ptr++ != '%')
+			continue;
+
+		/* skip width/precision */
+		while (	*ptr == '-' || *ptr == '+' || *ptr == '.' ||
+			*ptr == ' ' || isdigit(*ptr))
+			ptr++;
+			
+		switch(*ptr++) {
+			case 's':
+				stack_ptr -= 4;
+ 				win_stack -= 4;
+				*(DWORD*)stack_ptr = *(DWORD*)win_stack;
+				continue;
+			case 'l':
+				stack_ptr -= 4;
+				win_stack -= 4;
+				*(DWORD*)stack_ptr = *(DWORD*)win_stack;
+				ptr++; /* skip next type character */
+				continue;
+			case 'c':
+				stack_ptr -= 4;
+				win_stack -= 2;
+	
+/* windows' wsprintf() %c ignores 0's, we replace 0 with 1 to make sure
+   that the remaining part of the string isn't ignored by the winapp */
+				
+				if (*(WORD*)win_stack)
+					*(DWORD*)stack_ptr = *(WORD*)win_stack;
+				else
+					*(DWORD*)stack_ptr = 1;
+				continue;
+			case 'd':
+			case 'i':
+				stack_ptr -= 4;
+				win_stack -= 2;
+				*(int*)stack_ptr = *(INT*)win_stack;
+				continue;
+			case 'u':
+			case 'x':
+			case 'X':
+				stack_ptr -= 4;
+				win_stack -= 2;
+				*(DWORD*)stack_ptr = *(WORD*)win_stack;
+				continue;
+			default:
+				stack_ptr -= 4;
+				win_stack -= 4;
+				*(DWORD*)stack_ptr = 0;
+				fprintf(stderr, "wsprintf: oops, unknown formattype %c used!\n", *ptr);
+		}
+	} while (*ptr);
+
+	result = vsprintf(lpOutput, lpFormat, stack_ptr);
+	free(new_stack);
+
+	return result;
+}
+#endif
 
 /**************************************************************************
- *                wsprintf        [USER.420]
+ *                wsprintf        [USER.420] (not used by relay)
  */
 int wsprintf(LPSTR lpOutput, LPSTR lpFormat, ...)
 {
-va_list  valist;
-int      ArgCnt;
-va_start(valist, lpFormat);
-ArgCnt = vsprintf(lpOutput, lpFormat, valist);
-va_end(valist);
-return (ArgCnt);
+	va_list valist;
+	int ArgCnt;
+
+	va_start(valist, lpFormat);
+	ArgCnt = vsprintf(lpOutput, lpFormat, valist);
+	va_end(valist);
+
+	return ArgCnt;
 }
 
 
@@ -320,12 +434,11 @@
 
 	/* Change the format string so that ints are handled as short by
 	   default */
-	UTILITY_qualify(format, qualified_fmt);
 
 	/* Convert agruments to 32-bit values */
 	newargs = UTILITY_convertArgs(format, args);
-
 	result = vsprintf(buf, qualified_fmt, newargs);
+
 	free(newargs);
 	return result;
 };
diff --git a/windows/win.c b/windows/win.c
index aac7dcd..572dfe6 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -971,6 +971,15 @@
 	return FALSE;
 }
 
+/*******************************************************************
+ *			FlashWindow		[USER.105]
+ */
+BOOL FlashWindow(HWND hWnd, BOOL bInvert)
+{
+	printf("EMPTY STUB !! FlashWindow !\n");
+	return FALSE;
+}
+
 
 /*******************************************************************
  *			SetSysModalWindow		[USER.188]