diff --git a/ChangeLog b/ChangeLog
index e1c6f0a..59d5518 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,62 @@
 ----------------------------------------------------------------------
+Thu Aug  4 07:18:02 1994  Michael Patra  <micky@marie.physik.tu-berlin.de>
+
+        * [windows/message.c]
+	Implemented WaitMessage() (USER.112).
+
+        * [if1632/user.spec]
+	Added WaitMessage.
+
+	* [windows/defwnd.c]
+	WM_ERASEBKGND: Added support for hbrBackground=COLOR_xxx.
+
+   	* [miscemu/int{13,21,2a}.c]
+        * [miscemu/Imakefile]
+	* [signal/loader.c]
+	Added a few basic disk information and diagnostic functions to
+	prevent programs using this function from crashing. All drives
+	are claimed to be remote ones, so direct I/O isn't allowed.
+
+	* [controls/edit.c]
+	EDIT_WriteText(): Added code to correctly erase the remaining space
+	of the edit-control if the size of the control has changed sinced it's
+	creation.
+
+Tue Jul 26 22:05:54 MET DST 1994 Erik Bos <erik@hacktic.nl>
+
+	* [if1632/mouse.spec]
+	Added mouse.dll entry, no functions.
+
+	* [loader/resource.c]
+	Bug fix in AccessResource(). 
+
+	* [misc/keyboard.c], added [include/keyboard.h]
+	Changed functions to return more useful values.
+
+	* [windows/dialog.c]
+	Hacked DIALOG_GetControl() to support resources which
+	have 0xff00 - 0xffff as id. ** Needs to be done properly by
+	someone who knows the NE fileformat **
+
+Jul 29, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [windows/event.c]
+	Add new stub for EnableHGardwareInput() function.
+
+	* [windows/message.c]
+	Add coding for HWND_BROADCAST in PostMessage().
+
+	* [misc/file.c]
+	Add coding for OpenFile() also search in WindowPaths.
+
+	* [misc/mmsystem.c]
+	* [misc/audio.c]
+	* [misc/mmaux.c]
+	* [misc/mcicda.c]
+	Change #include "linux/soundcard.h" by #include "sys/soundcard.h"
+	Add coding in MMIO functions. Now, mmioDescend() can find WAV chunks.
+	SndPlaySound & MCI_ELEMENT now use MMIO and adjust to proper formats.
+----------------------------------------------------------------------
 Mon Jul 18 23:55:13 MET DST 1994
 
 	* [if1632/call.S]
diff --git a/controls/edit.c b/controls/edit.c
index 9779230..7f00cb8 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -1026,6 +1026,14 @@
 	SetTextColor(hdc, oldBkgdColor);
     }
 
+    if (strlen(blanks) < (ClientWidth(wndPtr) / charWidths[32]) + 2)
+    {
+        es->hBlankLine = EDIT_HeapReAlloc(hwnd, es->hBlankLine,
+             (ClientWidth(wndPtr) / charWidths[32]) + 2);
+        blanks = EDIT_HeapAddr(hwnd, es->hBlankLine);
+        memset(blanks, ' ', (ClientWidth(wndPtr) / charWidths[32]) + 2);
+    }
+
     if (!(cp = strchr(str, VK_TAB)))
 	TextOut(hdc, col - diff, row * es->txtht, str, strlen(str));
     else
diff --git a/controls/static.c b/controls/static.c
index a78fd77..0f84195 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -292,7 +292,7 @@
     GetClientRect(hwnd, &rc);
     FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH));
     textPtr = (LPSTR)USER_HEAP_ADDR(wndPtr->hText);
-    printf("SS_ICON : textPtr='%s' / left=%d top=%d right=%d bottom=%d \n", 
+    printf("SS_ICON : textPtr='%8x' / left=%d top=%d right=%d bottom=%d \n", 
     		textPtr, rc.left, rc.top, rc.right, rc.bottom);
 /*
     SetWindowPos(hwnd, (HWND)NULL, 0, 0, 32, 32,
diff --git a/debugger/dbg.y b/debugger/dbg.y
index b478308..907fd0f 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -147,11 +147,11 @@
 void
 wine_debug(int signal, int * regs)
 {
+	static int dummy_regs[32];
 	int i;
 #ifdef YYDEBUG
 	yydebug = 0;
 #endif
-	static int dummy_regs[32];
 
 	yyin = stdin;
 	regval = regs ? regs : dummy_regs;
diff --git a/if1632/Imakefile b/if1632/Imakefile
index f686a92..cc922a0 100644
--- a/if1632/Imakefile
+++ b/if1632/Imakefile
@@ -19,6 +19,7 @@
 	dll_kernel.o \
 	dll_keyboard.o \
 	dll_mmsystem.o \
+	dll_mouse.o \
 	dll_shell.o \
 	dll_sound.o \
 	dll_stress.o \
@@ -49,6 +50,7 @@
 MakeDllFromSpec(keyboard,$(TOP)/$(MODULE))
 MakeDllFromSpec(shell,$(TOP)/$(MODULE))
 MakeDllFromSpec(mmsystem,$(TOP)/$(MODULE))
+MakeDllFromSpec(mouse,$(TOP)/$(MODULE))
 MakeDllFromSpec(sound,$(TOP)/$(MODULE))
 MakeDllFromSpec(stress,$(TOP)/$(MODULE))
 MakeDllFromSpec(system,$(TOP)/$(MODULE))
diff --git a/if1632/mouse.spec b/if1632/mouse.spec
new file mode 100644
index 0000000..6d15268
--- /dev/null
+++ b/if1632/mouse.spec
@@ -0,0 +1,11 @@
+name	mouse
+id	14
+length	8
+
+#1 pascal INQUIRE
+#2 pascal ENABLE
+#3 pascal DISABLE
+#4 pascal MOUSEGETINTVECT
+#5 pascal GETSETMOUSEDATA
+#6 pascal CPLAPPLET
+#7 pascal POWEREVENTPROC
diff --git a/if1632/relay.c b/if1632/relay.c
index 9de7655..070a58a 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -45,6 +45,7 @@
     { "MMSYSTEM",WineLibSkip(MMSYSTEM_table),1226,11},
     { "SYSTEM",  WineLibSkip(SYSTEM_table),   20 ,12},
     { "TOOLHELP",WineLibSkip(TOOLHELP_table), 83, 13},
+    { "MOUSE",   WineLibSkip(MOUSE_table),     8, 14},
 };
 /* don't forget to increase N_BUILTINS in dll.h if you add a dll */
 
diff --git a/if1632/user.spec b/if1632/user.spec
index a8e5597..88c5d9d 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -115,7 +115,7 @@
 109 pascal PeekMessage(ptr word word word word) PeekMessage(1 2 3 4 5)
 110 pascal PostMessage(word word word long) PostMessage(1 2 3 4)
 111 pascal SendMessage(word word word long) SendMessage(1 2 3 4)
-#112 WAITMESSAGE
+112 pascal WaitMessage() WaitMessage()
 113 pascal TranslateMessage(ptr) TranslateMessage(1)
 114 pascal DispatchMessage(ptr) DispatchMessage(1)
 #115 REPLYMESSAGE
@@ -261,13 +261,13 @@
 248 pascal GetOpenClipboardWindow() GetOpenClipboardWindow()
 249 pascal GetAsyncKeyState(word) GetAsyncKeyState(1)
 250 pascal GetMenuState(word word word) GetMenuState(1 2 3)
-#251 SENDDRIVERMESSAGE
-#252 OPENDRIVER
-#253 CLOSEDRIVER
-#254 GETDRIVERMODULEHANDLE
-#255 DEFDRIVERPROC
-#256 GETDRIVERINFO
-#257 GETNEXTDRIVER
+251 pascal SendDriverMessage(word word long long) SendDriverMessage(1 2 3 4)
+252 pascal OpenDriver(ptr ptr long) OpenDriver(1 2 3)
+253 pascal CloseDriver(word word long) CloseDriver(1 2 3)
+254 pascal GetDriverModuleHandle(word) GetDriverModuleHandle(1)
+255 pascal DefDriverProc(long word word long long) DefDriverProc(1 2 3 4 5)
+256 pascal GetDriverInfo(word ptr) GetDriverInfo(1 2)
+257 pascal GetNextDriver(word long) GetNextDriver(1 2)
 258 pascal MapWindowPoints(word word ptr word) MapWindowPoints(1 2 3 4)
 #259 BEGINDEFERWINDOWPOS
 #260 DEFERWINDOWPOS
@@ -319,7 +319,7 @@
 324 pascal FillWindow(word word word word) FillWindow(1 2 3 4)
 325 pascal PaintRect(word word word word ptr) PaintRect(1 2 3 4 5)
 #326 GETCONTROLBRUSH
-#331 ENABLEHARDWAREINPUT
+331 pascal EnableHardwareInput(word) EnableHardwareInput(1)
 332 return UserYield 0 0
 #333 ISUSERIDLE
 334 pascal GetQueueStatus(word) GetQueueStatus(1)
diff --git a/include/dlls.h b/include/dlls.h
index 9796955..292b57f 100644
--- a/include/dlls.h
+++ b/include/dlls.h
@@ -96,7 +96,8 @@
 extern struct dll_table_entry_s STRESS_table[];
 extern struct dll_table_entry_s SYSTEM_table[];
 extern struct dll_table_entry_s TOOLHELP_table[];
+extern struct dll_table_entry_s MOUSE_table[];
 
-#define N_BUILTINS	13
+#define N_BUILTINS	14
 
 #endif /* DLLS_H */
diff --git a/include/keyboard.h b/include/keyboard.h
new file mode 100644
index 0000000..c9f784f
--- /dev/null
+++ b/include/keyboard.h
@@ -0,0 +1,114 @@
+#ifndef __WINE_KEYBOARD_H
+#define __WINE_KEYBOARD_H
+
+struct KeyTableEntry {
+	int virtualkey;
+	int ASCII;
+	int scancode;
+	char *name;
+};
+
+struct KeyTableEntry KeyTable[] = {
+	{ 0x3, 0x3, 0x0, "" },
+	{ 0x8, 0x8, 0xe, "Backspace" },
+	{ 0x9, 0x9, 0xf, "Tab" },
+	{ 0xc, 0x0, 0x4c, "Num 5" },
+	{ 0xd, 0xd, 0x1c, "Enter" },
+	{ 0x10, 0x0, 0x2a, "Shift" },
+	{ 0x11, 0x0, 0x1d, "Ctrl" },
+	{ 0x12, 0x0, 0x38, "Alt" },
+	{ 0x14, 0x0, 0x3a, "Caps Lock" },
+	{ 0x1b, 0x1b, 0x1, "Esc" },
+	{ 0x20, 0x20, 0x39, "Space" },
+	{ 0x21, 0x0, 0x49, "Num 9" },
+	{ 0x22, 0x0, 0x51, "Num 3" },
+	{ 0x23, 0x0, 0x4f, "Num 1" },
+	{ 0x24, 0x0, 0x47, "Num 7" },
+	{ 0x25, 0x0, 0x4b, "Num 4" },
+	{ 0x26, 0x0, 0x48, "Num 8" },
+	{ 0x27, 0x0, 0x4d, "Num 6" },
+	{ 0x28, 0x0, 0x50, "Num 2" },
+	{ 0x2d, 0x0, 0x52, "Num 0" },
+	{ 0x2e, 0x0, 0x53, "Num Del" },
+	{ 0x30, 0x30, 0xb, "0" },
+	{ 0x31, 0x31, 0x2, "1" },
+	{ 0x32, 0x32, 0x3, "2" },
+	{ 0x33, 0x33, 0x4, "3" },
+	{ 0x34, 0x34, 0x5, "4" },
+	{ 0x35, 0x35, 0x6, "5" },
+	{ 0x36, 0x36, 0x7, "6" },
+	{ 0x37, 0x37, 0x8, "7" },
+	{ 0x38, 0x38, 0x9, "8" },
+	{ 0x39, 0x39, 0xa, "9" },
+	{ 0x41, 0x41, 0x1e, "A" },
+	{ 0x42, 0x42, 0x30, "B" },
+	{ 0x43, 0x43, 0x2e, "C" },
+	{ 0x44, 0x44, 0x20, "D" },
+	{ 0x45, 0x45, 0x12, "E" },
+	{ 0x46, 0x46, 0x21, "F" },
+	{ 0x47, 0x47, 0x22, "G" },
+	{ 0x48, 0x48, 0x23, "H" },
+	{ 0x49, 0x49, 0x17, "I" },
+	{ 0x4a, 0x4a, 0x24, "J" },
+	{ 0x4b, 0x4b, 0x25, "K" },
+	{ 0x4c, 0x4c, 0x26, "L" },
+	{ 0x4d, 0x4d, 0x32, "M" },
+	{ 0x4e, 0x4e, 0x31, "N" },
+	{ 0x4f, 0x4f, 0x18, "O" },
+	{ 0x50, 0x50, 0x19, "P" },
+	{ 0x51, 0x51, 0x10, "Q" },
+	{ 0x52, 0x52, 0x13, "R" },
+	{ 0x53, 0x53, 0x1f, "S" },
+	{ 0x54, 0x54, 0x14, "T" },
+	{ 0x55, 0x55, 0x16, "U" },
+	{ 0x56, 0x56, 0x2f, "V" },
+	{ 0x57, 0x57, 0x11, "W" },
+	{ 0x58, 0x58, 0x2d, "X" },
+	{ 0x59, 0x59, 0x15, "Y" },
+	{ 0x5a, 0x5a, 0x2c, "Z" },
+	{ 0x60, 0x0, 0x52, "Num 0" },
+	{ 0x61, 0x0, 0x4f, "Num 1" },
+	{ 0x62, 0x0, 0x50, "Num 2" },
+	{ 0x63, 0x0, 0x51, "Num 3" },
+	{ 0x64, 0x0, 0x4b, "Num 4" },
+	{ 0x65, 0x0, 0x4c, "Num 5" },
+	{ 0x66, 0x0, 0x4d, "Num 6" },
+	{ 0x67, 0x0, 0x47, "Num 7" },
+	{ 0x68, 0x0, 0x48, "Num 8" },
+	{ 0x69, 0x0, 0x49, "Num 9" },
+	{ 0x6a, 0x2a, 0x37, "Num *" },
+	{ 0x6b, 0x2b, 0x4e, "Num +" },
+	{ 0x6c, 0x0, 0x0, "" },
+	{ 0x6d, 0x2d, 0x4a, "Num -" },
+	{ 0x6e, 0x2e, 0x53, "Num Del" },
+	{ 0x6f, 0x2f, 0x0, "" },
+	{ 0x70, 0x0, 0x3b, "F1" },
+	{ 0x71, 0x0, 0x3c, "F2" },
+	{ 0x72, 0x0, 0x3d, "F3" },
+	{ 0x73, 0x0, 0x3e, "F4" },
+	{ 0x74, 0x0, 0x3f, "F5" },
+	{ 0x75, 0x0, 0x40, "F6" },
+	{ 0x76, 0x0, 0x41, "F7" },
+	{ 0x77, 0x0, 0x42, "F8" },
+	{ 0x78, 0x0, 0x43, "F9" },
+	{ 0x79, 0x0, 0x44, "F10" },
+	{ 0x7a, 0x0, 0x57, "F11" },
+	{ 0x7b, 0x0, 0x58, "F12" },
+	{ 0x90, 0x0, 0x45, "Pause" },
+	{ 0x91, 0x0, 0x46, "Scroll Lock" },
+	{ 0xba, 0x3b, 0x27, ";" },
+	{ 0xbb, 0x3d, 0xd, "=" },
+	{ 0xbc, 0x2c, 0x33, "," },
+	{ 0xbd, 0x2d, 0xc, "-" },
+	{ 0xbe, 0x2e, 0x34, "." },
+	{ 0xbf, 0x2f, 0x35, "/" },
+	{ 0xc0, 0x60, 0x29, "`" },
+	{ 0xdb, 0x5b, 0x1a, "[" },
+	{ 0xdc, 0x5c, 0x2b, "\\" },
+	{ 0xdd, 0x5d, 0x1b, "]" },
+	{ 0xde, 0x27, 0x28, "\'" },
+	{ 0xe2, 0x5c, 0x56, "\\" },
+};
+#define KeyTableSize	sizeof(KeyTable) / sizeof(struct KeyTableEntry)
+
+#endif /* __WINE_KEYBOARD_H */
diff --git a/include/mmsystem.h b/include/mmsystem.h
index feb2eda..815f431 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -623,6 +623,10 @@
 #define MMIO_CREATERIFF         0x0020  /* mmioCreateChunk: make a LIST chunk */
 #define MMIO_CREATELIST         0x0040  /* mmioCreateChunk: make a RIFF chunk */
 
+#define SEEK_SET   0
+#define SEEK_CUR   1
+#define SEEK_END   2
+
 #define MMIOM_READ      MMIO_READ       /* read */
 #define MMIOM_WRITE    MMIO_WRITE       /* write */
 #define MMIOM_SEEK              2       /* seek to a new position in file */
diff --git a/loader/resource.c b/loader/resource.c
index 4211704..662fa34 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -493,7 +493,7 @@
     off_t rtoff;
     if (hInst == 0) return 0;
 #ifdef DEBUG_RESOURCE
-    printf("GetRsrcCount hInst=%04X typename=%08X\n", hInst, type_name);
+    printf("GetRsrcCount hInst=%04X typename=%08X\n", hInst, type_id);
 #endif
     if (OpenResourceFile(hInst) < 0)	return 0;
 
@@ -978,7 +978,7 @@
     lseek(resfile, ((int) r->nameinfo.offset << r->size_shift), SEEK_SET);
     GlobalUnlock(hResInfo);
 
-    return resfile;
+    return dup(resfile);
 }
 
 /**********************************************************************
@@ -1049,9 +1049,9 @@
     }
     if (size_shift == -1) {
     	if ((LONG)rsc_name >= 0x00010000L)
-	    printf("RSC_LoadResource / Resource '%s' not Found !\n", rsc_name);
+	    printf("RSC_LoadResource inst (%x)/ Resource '%s' not Found !\n", instance, rsc_name);
 	else
-	    printf("RSC_LoadResource / Resource '%X' not Found !\n", rsc_name);
+	    printf("RSC_LoadResource inst (%x)/ Resource '0x%X' not Found !\n", instance, rsc_name);
 	return 0;
 	}
     /*
diff --git a/loader/signal.c b/loader/signal.c
index 9b8e851..d9eb717 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -59,6 +59,7 @@
 		scp->sc_eax = (scp->sc_eax & 0xffff0000L) | 640L; 
 		return 1;	/* get base mem size */                
 
+              case 0x13: return do_int13(scp);
 	      case 0x15: return do_int15(scp);
 	      case 0x16: return do_int16(scp);
 	      case 0x1A: return do_int1A(scp);
@@ -73,6 +74,7 @@
 
 	      case 0x25: return do_int25(scp);
 	      case 0x26: return do_int26(scp);
+              case 0x2a: return do_int2a(scp);
 	      case 0x2f: return do_int2f(scp);
 	      case 0x31: return do_int31(scp);
 	}
diff --git a/misc/audio.c b/misc/audio.c
index 98ab81c..2d81e37 100644
--- a/misc/audio.c
+++ b/misc/audio.c
@@ -3,11 +3,16 @@
  *
  * Copyright 1994 Martin Ayotte
  */
-#ifndef WINELIB
-#define DEBUG_MCIWAVE
-
 static char Copyright[] = "Copyright  Martin Ayotte, 1994";
 
+#ifndef WINELIB
+#define BUILTIN_MMSYSTEM
+#endif 
+
+#ifdef BUILTIN_MMSYSTEM
+
+#define DEBUG_MCIWAVE
+
 #include "stdio.h"
 #include "win.h"
 #include "user.h"
@@ -60,7 +65,7 @@
     BOOL    fShareable;         /* TRUE if first open was shareable */
     WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
     HANDLE  hCallback;          /* Callback handle for pending notification */
-	int		hFile;				/* file handle open as Element		*/
+	HMMIO	hFile;				/* mmio file handle open as Element		*/
 	MCI_WAVE_OPEN_PARMS openParms;
 	PCMWAVEFORMAT	WaveFormat;
 	WAVEHDR		WaveHdr;
@@ -207,13 +212,13 @@
     if (dwFlags & MCI_OPEN_ELEMENT) {
 		printf("WAVE_mciOpen // MCI_OPEN_ELEMENT '%s' !\n", 
 								lpParms->lpstrElementName);
-		printf("WAVE_mciOpen // cdw='%s'\n", DOS_GetCurrentDir(DOS_GetDefaultDrive()));
+/*		printf("WAVE_mciOpen // cdw='%s'\n", DOS_GetCurrentDir(DOS_GetDefaultDrive())); */
 		if (strlen(lpParms->lpstrElementName) > 0) {
 			strcpy(str, lpParms->lpstrElementName);
 			AnsiUpper(str);
-			MCIWavDev[wDevID].hFile = _lopen(str, OF_READWRITE);
-			if (MCIWavDev[wDevID].hFile < 1) {
-				MCIWavDev[wDevID].hFile = 0;
+			MCIWavDev[wDevID].hFile = mmioOpen(str, NULL, 
+				MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_EXCLUSIVE);
+			if (MCIWavDev[wDevID].hFile == 0) {
 				printf("WAVE_mciOpen // can't find file='%s' !\n", str);
 				return MCIERR_FILE_NOT_FOUND;
 				}
@@ -233,6 +238,49 @@
 	lpWaveFormat->wf.nSamplesPerSec = 11025;
 	lpWaveFormat->wf.nAvgBytesPerSec = 11025;
 	lpWaveFormat->wf.nBlockAlign = 1;
+	if (MCIWavDev[wDevID].hFile != 0) {
+		MMCKINFO	mmckInfo;
+		MMCKINFO	ckMainRIFF;
+		if (mmioDescend(MCIWavDev[wDevID].hFile, &ckMainRIFF, NULL, 0) != 0) {
+			return MCIERR_INTERNAL;
+			}
+#ifdef DEBUG_MCIWAVE
+		printf("WAVE_mciOpen // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
+				(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
+				ckMainRIFF.cksize);
+#endif
+		if ((ckMainRIFF.ckid != FOURCC_RIFF) ||
+		    (ckMainRIFF.fccType != mmioFOURCC('W', 'A', 'V', 'E'))) {
+			return MCIERR_INTERNAL;
+			}
+		mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
+		if (mmioDescend(MCIWavDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
+			return MCIERR_INTERNAL;
+			}
+#ifdef DEBUG_MCIWAVE
+		printf("WAVE_mciOpen // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
+				(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
+				mmckInfo.cksize);
+#endif
+		if (mmioRead(MCIWavDev[wDevID].hFile, (HPSTR) lpWaveFormat,
+		    (long) sizeof(PCMWAVEFORMAT)) != (long) sizeof(PCMWAVEFORMAT)) {
+			return MCIERR_INTERNAL;
+			}
+		mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
+		if (mmioDescend(MCIWavDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
+			return MCIERR_INTERNAL;
+			}
+#ifdef DEBUG_MCIWAVE
+		printf("WAVE_mciOpen // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
+				(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
+				mmckInfo.cksize);
+		printf("WAVE_mciOpen // nChannels=%d nSamplesPerSec=%d\n",
+			lpWaveFormat->wf.nChannels, lpWaveFormat->wf.nSamplesPerSec);
+#endif
+		lpWaveFormat->wBitsPerSample = 0;
+		}
+	lpWaveFormat->wf.nAvgBytesPerSec = 
+		lpWaveFormat->wf.nSamplesPerSec * lpWaveFormat->wf.nBlockAlign;
 	dwRet = wodMessage(0, WODM_OPEN, 0, (DWORD)&WaveDesc, CALLBACK_NULL);
 	dwRet = widMessage(0, WIDM_OPEN, 0, (DWORD)&WaveDesc, CALLBACK_NULL);
 	return 0;
@@ -318,20 +366,18 @@
 	lpWaveHdr->dwFlags = 0L;
 	lpWaveHdr->dwLoops = 0L;
 	dwRet = wodMessage(0, WODM_PREPARE, 0, (DWORD)lpWaveHdr, sizeof(WAVEHDR));
-	printf("WAVE_mciPlay // after WODM_PREPARE \n");
+/*	printf("WAVE_mciPlay // after WODM_PREPARE \n"); */
 	while(TRUE) {
-/*		printf("WAVE_mciPlay // before 'read' hFile=%u lpData=%08X dwBufferLength=%u\n",
-				MCIWavDev[wDevID].hFile, lpWaveHdr->lpData, lpWaveHdr->dwBufferLength); */
-		count = _lread(MCIWavDev[wDevID].hFile, lpWaveHdr->lpData, lpWaveHdr->dwBufferLength);
+		count = mmioRead(MCIWavDev[wDevID].hFile, lpWaveHdr->lpData, lpWaveHdr->dwBufferLength);
 		if (count < 1) break;
 		lpWaveHdr->dwBytesRecorded = count;
+#ifdef DEBUG_MCIWAVE
 		printf("WAVE_mciPlay // before WODM_WRITE lpWaveHdr=%08X dwBytesRecorded=%u\n",
 					lpWaveHdr, lpWaveHdr->dwBytesRecorded);
+#endif
 		dwRet = wodMessage(0, WODM_WRITE, 0, (DWORD)lpWaveHdr, sizeof(WAVEHDR));
 		}
-	printf("WAVE_mciPlay // before WODM_UNPREPARE \n");
 	dwRet = wodMessage(0, WODM_UNPREPARE, 0, (DWORD)lpWaveHdr, sizeof(WAVEHDR));
-	printf("WAVE_mciPlay // after WODM_UNPREPARE \n");
 	if (lpWaveHdr->lpData != NULL) {
 		free(lpWaveHdr->lpData);
 		lpWaveHdr->lpData = NULL;
@@ -1642,4 +1688,4 @@
 	return MMSYSERR_NOTENABLED;
 }
 
-#endif /* !WINELIB */
+#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/misc/driver.c b/misc/driver.c
index 28888b5..436daf7 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -15,6 +15,26 @@
 
 LPDRIVERITEM lpDrvItemList = NULL;
 
+void LoadStartupDrivers()
+{
+	HDRVR	hDrv;
+	char	str[256];
+	LPSTR	ptr	= str;
+	LPSTR	file = "SYSTEM.INI";
+	if (GetPrivateProfileString("drivers", NULL, 
+		"", str, sizeof(str), file) < 2) {
+		printf("LoadStartupDrivers // can't find drivers section in '%s'\n", file);
+		return;
+		}
+	while(strlen(ptr) != 0) {
+		printf("LoadStartupDrivers // str='%s'\n", ptr);
+		hDrv = OpenDriver(ptr, "drivers", 0L);
+		printf("LoadStartupDrivers // hDrv=%04X\n", hDrv);
+		ptr += strlen(ptr) + 1;
+		}
+	printf("LoadStartupDrivers // end of list !\n");
+}
+
 /**************************************************************************
  *				SendDriverMessage		[USER.251]
  */
@@ -48,12 +68,13 @@
 	lpnewdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
 	if (lpnewdrv == NULL) return 0;
 	lpnewdrv->dis.length = sizeof(DRIVERINFOSTRUCT);
-	lpnewdrv->dis.hModule = LoadImage("DrvName", DLL, 0);
+	lpnewdrv->dis.hModule = 0;
+/*	lpnewdrv->dis.hModule = LoadImage(DrvName, DLL, 0);
 	if (lpnewdrv->dis.hModule == 0) {
 		GlobalUnlock(hDrvr);
 		GlobalFree(hDrvr);
 		return 0;
-		}
+		} */
 	lpnewdrv->dis.hDriver = hDrvr;
 	strcpy(lpnewdrv->dis.szAliasName, lpDriverName);
 	lpnewdrv->count = 0;
@@ -165,18 +186,30 @@
 	LPDRIVERITEM	lpdrv;
 	HDRVR			hRetDrv = 0;
 	printf("GetNextDriver(%04X, %08X);\n", hDrvr, dwFlags);
+	if (hDrvr == 0) {
+		if (lpDrvItemList == NULL) {
+			printf("GetNextDriver // drivers list empty !\n");
+			LoadStartupDrivers();
+			if (lpDrvItemList == NULL) return 0;
+			}
+		printf("GetNextDriver // return first %04X !\n", 
+							lpDrvItemList->dis.hDriver);
+		return lpDrvItemList->dis.hDriver;
+		}
 	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
 	if (lpdrv != NULL) {
-		if (dwFlags & GND_REVERSE) 
+		if (dwFlags & GND_REVERSE) {
 			if (lpdrv->lpPrevItem) 
 				hRetDrv = ((LPDRIVERITEM)lpdrv->lpPrevItem)->dis.hDriver;
-		if (dwFlags & GND_FORWARD) 
+			}
+		else {
 			if (lpdrv->lpNextItem) 
 				hRetDrv = ((LPDRIVERITEM)lpdrv->lpNextItem)->dis.hDriver;
+			}
 		GlobalUnlock(hDrvr);
 		}
+	printf("GetNextDriver // return %04X !\n", hRetDrv);
 	return hRetDrv;
-	
 }
 
 
diff --git a/misc/file.c b/misc/file.c
index 29ed173..92359fd 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -28,6 +28,7 @@
 /* #define DEBUG_FILE /* */
 
 char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256];
+extern char WindowsPath[256];
 
 /***************************************************************************
  _lopen 
@@ -123,9 +124,10 @@
 {
     int 	base, flags;
     int		handle;
+	char	buf[256];
 
 #ifdef DEBUG_FILE
-    fprintf(stderr,"Openfile(%s,<struct>,%d) ",lpFileName,wStyle);
+    fprintf(stderr,"OpenFile(%s,<struct>,%04X)\n",lpFileName,wStyle);
 #endif
 
     base   = wStyle & 0xF;
@@ -150,6 +152,12 @@
     {
 	printf("OpenFile // OF_EXIST '%s' !\n", lpFileName);
 	handle = _lopen (lpFileName, wStyle);
+	if (handle == -1) {
+		/* Try again with WindowsPath */
+		if (FindFile(buf, sizeof(buf), lpFileName, NULL, WindowsPath) != NULL) {
+			handle = _lopen (buf, wStyle);
+			}
+		}
 	close(handle);
 	return handle;
     }
@@ -160,12 +168,21 @@
     }
     else 
     {
-	int  handle;
-	char *UnixFileName;
-
+	int  	handle;
+	char 	*UnixFileName;
 	if ((UnixFileName = GetUnixFileName(lpFileName)) == NULL)
 	    return HFILE_ERROR;
 	handle = open(UnixFileName, base, 0666);
+	if (handle == -1) {
+		/* Try again with WindowsPath */
+		if (FindFile(buf, sizeof(buf), lpFileName, NULL, WindowsPath) != NULL) {
+#ifdef DEBUG_FILE
+			printf("OpenFile // file '%s' found !\n", buf);
+#endif
+			UnixFileName = buf;
+			handle = open(UnixFileName, base, 0666);
+			}
+		}
 
 #ifdef DEBUG_FILE
 	fprintf(stderr, "OpenFile: returning %04.4x\n", handle);
diff --git a/misc/keyboard.c b/misc/keyboard.c
index 178a74f..d7c9ce2 100644
--- a/misc/keyboard.c
+++ b/misc/keyboard.c
@@ -1,49 +1,53 @@
 static char RCSId[] = "$Id: keyboard.c,v 1.2 1993/09/13 18:52:02 scott Exp $";
-static char Copyright[] = "Copyright  Scott A. Laird, 1993";
+static char Copyright[] = "Copyright  Scott A. Laird, Erik Bos  1993, 1994";
 
 #include <stdlib.h>
 #include <stdio.h>
 #include "prototypes.h"
 #include "windows.h"
+#include "keyboard.h"
 
 int ToAscii(WORD wVirtKey, WORD wScanCode, LPSTR lpKeyState, 
-	    LPVOID lpChar, WORD wFlags) 
+	LPVOID lpChar, WORD wFlags) 
 {
-  printf("ToAscii (%d,%d)\n",wVirtKey, wScanCode);
-  return -1;
+	int i;
+
+	printf("ToAscii (%d,%d)\n",wVirtKey, wScanCode);
+
+	/* FIXME: this is not sufficient but better than returing -1 */
+
+	for (i = 0 ; i != KeyTableSize ; i++) 
+		if (KeyTable[i].virtualkey == wVirtKey)  {
+			*(BYTE*)lpChar++ = *KeyTable[i].name;
+			*(BYTE*)lpChar = 0;
+			return 1;
+		}
+
+	*(BYTE*)lpChar = 0;
+	return 0;
 }
 
-#ifdef  BOGUS_ANSI_OEM
-
-int AnsiToOem(LPSTR lpAnsiStr, LPSTR lpOemStr)
-{
-  printf("AnsiToOem (%s)\n",lpAnsiStr);
-  strcpy(lpOemStr,lpAnsiStr);  /* Probably not the right thing to do, but... */
-  return -1;
-}
-
-BOOL OemToAnsi(LPSTR lpOemStr, LPSTR lpAnsiStr)
-{
-  printf("OemToAnsi (%s)\n",lpOemStr);
-  strcpy(lpAnsiStr,lpOemStr);  /* Probably not the right thing to do, but... */
-  return -1;
-}
-
-#endif
-
 DWORD OemKeyScan(WORD wOemChar)
 {
-  printf("*OemKeyScan (%d)\n",wOemChar);
-  return 0;
+	printf("*OemKeyScan (%d)\n",wOemChar);
+
+	return wOemChar;
 }
 
 /* VkKeyScan translates an ANSI character to a virtual-key and shift code
- * for the current keyboard.  For now we return -1, which is fail. */
+ * for the current keyboard. */
 
 WORD VkKeyScan(WORD cChar)
 {
-  printf("VkKeyScan (%d)\n",cChar);
-  return -1;
+	int i;
+	
+	printf("VkKeyScan (%d)\n",cChar);
+	
+	for (i = 0 ; i != KeyTableSize ; i++) 
+		if (KeyTable[i].ASCII == cChar)
+			return KeyTable[i].virtualkey;
+
+	return -1;
 }
 
 int GetKeyboardType(int nTypeFlag)
@@ -61,58 +65,64 @@
       return 12;   /* We're doing an 101 for now, so return 12 F-keys */
       break;
     default:     
-      printf("  Unknown type on GetKeyboardType\n");
+      fprintf(stderr, "Unknown type on GetKeyboardType\n");
       return 0;    /* The book says 0 here, so 0 */
     }
 }
 
-/* MapVirtualKey translates keycodes from one format to another.  This
- *  is a total punt.  */
+/* MapVirtualKey translates keycodes from one format to another. */
 
 WORD MapVirtualKey(WORD wCode, WORD wMapType)
 {
-  printf("*MapVirtualKey(%d,%d)\n",wCode,wMapType);
-  return 0;
+	int i;
+	
+	switch(wMapType) {
+		case 0:
+			for (i = 0 ; i != KeyTableSize ; i++) 
+				if (KeyTable[i].virtualkey == wCode) 
+					return KeyTable[i].scancode;
+			return 0;
+
+		case 1:
+			for (i = 0 ; i != KeyTableSize ; i++) 
+				if (KeyTable[i].scancode == wCode) 
+					return KeyTable[i].virtualkey;
+			return 0;
+
+		case 2:
+			for (i = 0 ; i != KeyTableSize ; i++) 
+				if (KeyTable[i].virtualkey == wCode) 
+					return KeyTable[i].ASCII;
+			return 0;
+
+		default: 
+			fprintf(stderr, "MapVirtualKey: unknown wMapType!\n");
+			return 0;	
+	}
+	return 0;
 }
 
 int GetKbCodePage(void)
 {
-  printf("GetKbCodePage()\n");
-  return 437; /* US -- probably should be 850 from time to time */
+	printf("GetKbCodePage()\n");
+	return 850;
 }
 
-/* This should distinguish key names.  Maybe later */
-
 int GetKeyNameText(LONG lParam, LPSTR lpBuffer, int nSize)
 {
-  printf("GetKeyNameText(%d,<ptr>, %d)\n",lParam,nSize);
-  lpBuffer[0]=0;  /* This key has no name */
-  return 0;
+	int i;
+	
+	printf("GetKeyNameText(%d,<ptr>, %d)\n",lParam,nSize);
+
+	lParam >>= 16;
+	lParam &= 0xff;
+
+	for (i = 0 ; i != KeyTableSize ; i++) 
+		if (KeyTable[i].scancode == lParam)  {
+			strncpy(lpBuffer, KeyTable[i].name, nSize);
+			return strlen(lpBuffer);
+		}
+
+	*lpBuffer = 0;
+	return 0;
 }
-
-#ifdef  BOGUS_ANSI_OEM
-
-void AnsiToOemBuff(LPSTR lpAnsiStr, LPSTR lpOemStr, int nLength)
-{
-  printf("AnsiToOemBuff(%s,<ptr>,%d)\n",lpAnsiStr,nLength);
-  strncpy(lpOemStr,lpAnsiStr,nLength);  /* should translate... */
-}
-
-void OemToAnsiBuff(LPSTR lpOemStr, LPSTR lpAnsiStr, int nLength)
-{
-  printf("OemToAnsiBuff(%s,<ptr>,%d)\n",lpOemStr,nLength);
-  strncpy(lpAnsiStr,lpOemStr,nLength);  /* should translate... */
-}
-
-#endif
-
-
-
-
-
-
-
-
-
-
-
diff --git a/misc/mcicda.c b/misc/mcicda.c
index c96fb27..93096f2 100644
--- a/misc/mcicda.c
+++ b/misc/mcicda.c
@@ -3,9 +3,14 @@
  *
  * Copyright 1994 Martin Ayotte
  */
-#ifndef WINELIB
 static char Copyright[] = "Copyright  Martin Ayotte, 1994";
 
+#ifndef WINELIB
+#define BUILTIN_MMSYSTEM
+#endif 
+
+#ifdef BUILTIN_MMSYSTEM
+
 /*
 #define DEBUG_CDAUDIO
 */
@@ -158,7 +163,7 @@
 #endif
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	if (dwFlags & MCI_GETDEVCAPS_ITEM) {
-		printf("CDAUDIO_mciGetDevCaps // MCI_GETDEVCAPS_ITEM dwItem=%08X);\n", 
+		printf("CDAUDIO_mciGetDevCaps // MCI_GETDEVCAPS_ITEM dwItem=%08X;\n", 
 				lpParms->dwItem);
 		switch(lpParms->dwItem) {
 			case MCI_GETDEVCAPS_CAN_RECORD:
@@ -192,7 +197,7 @@
 				return MCIERR_UNRECOGNIZED_COMMAND;
 			}
 		}
-	printf("CDAUDIO_mciGetDevCaps // lpParms->dwReturn=%08X);\n", lpParms->dwReturn);
+	printf("CDAUDIO_mciGetDevCaps // lpParms->dwReturn=%08X;\n", lpParms->dwReturn);
  	return 0;
 #else
 	return MCIERR_INTERNAL;
@@ -486,6 +491,7 @@
 	if (CDADev[wDevID].nTracks == 0) {
 		if (CDAUDIO_GetNumberOfTracks(wDevID) == (WORD)-1) return FALSE;
 		}
+	printf("CDAUDIO_GetTracksInfo // nTracks=%u\n", CDADev[wDevID].nTracks);
 	if (CDADev[wDevID].lpdwTrackLen != NULL) 
 		free(CDADev[wDevID].lpdwTrackLen);
 	CDADev[wDevID].lpdwTrackLen = (LPDWORD)malloc(
@@ -533,6 +539,7 @@
 		}
 	CDADev[wDevID].dwTotalLen = total_length;
 	printf("CDAUDIO_GetTracksInfo // total_len=%u\n", total_length);
+	fflush(stdout);
 	return TRUE;
 #else
 	return FALSE;
@@ -552,7 +559,7 @@
 #ifdef DEBUG_CDAUDIO
 		printf("CDAUDIO_GetCDStatus // opened or no_media !\n");
 #endif
-		CDADev[wDevID].mode = MCI_MODE_OPEN;
+		CDADev[wDevID].mode = MCI_MODE_NOT_READY;
 		return TRUE;
 		}
 	switch (CDADev[wDevID].sc.cdsc_audiostatus) {
@@ -923,4 +930,4 @@
 
 /*-----------------------------------------------------------------------*/
 
-#endif
+#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/misc/mmaux.c b/misc/mmaux.c
index a83bf45..36a2d74 100644
--- a/misc/mmaux.c
+++ b/misc/mmaux.c
@@ -3,9 +3,14 @@
  *
  * Copyright 1994 Martin Ayotte
  */
-#ifndef WINELIB
 static char Copyright[] = "Copyright  Martin Ayotte, 1994";
 
+#ifndef WINELIB
+#define BUILTIN_MMSYSTEM
+#endif 
+
+#ifdef BUILTIN_MMSYSTEM
+
 #include "stdio.h"
 #include "win.h"
 #include "user.h"
@@ -128,4 +133,4 @@
 }
 
 
-#endif /* !WINELIB */
+#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/misc/mmsystem.c b/misc/mmsystem.c
index 0e1eb91..ef8d5ca 100644
--- a/misc/mmsystem.c
+++ b/misc/mmsystem.c
@@ -3,9 +3,10 @@
  *
  * Copyright 1993 Martin Ayotte
  */
-#ifndef WINELIB
 static char Copyright[] = "Copyright  Martin Ayotte, 1993";
 
+#ifndef WINELIB
+
 #include "stdio.h"
 #include <fcntl.h>
 #include <sys/ioctl.h>
@@ -38,6 +39,8 @@
 
 UINT WINAPI midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
 UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+LRESULT DrvDefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, 
+						DWORD dwParam1, DWORD dwParam2);
 
 
 /**************************************************************************
@@ -55,66 +58,91 @@
 */
 BOOL WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT uFlags)
 {
-	int			hFile;
-	int			count;
-	WAVEHDR		WaveHdr;
-	PCMWAVEFORMAT	WaveFormat;
+	HMMIO			hmmio;
+	MMCKINFO		mmckInfo;
+	MMCKINFO		ckMainRIFF;
+	PCMWAVEFORMAT 	pcmWaveFormat;
+	int				count;
+	WAVEHDR			WaveHdr;
 	WAVEOPENDESC 	WaveDesc;
-	DWORD		dwRet;
-	char		str[128];
-	LPSTR		ptr;
+	DWORD			dwRet;
+	char			str[128];
+	LPSTR			ptr;
 	printf("sndPlaySound // SoundName='%s' uFlags=%04X !\n", 
 									lpszSoundName, uFlags);
 	if (lpszSoundName == NULL) {
 		printf("sndPlaySound // Stop !\n");
 		return FALSE;
 		}
-	hFile = open(lpszSoundName, O_RDONLY);
-	if (hFile == 0) {
+	hmmio = mmioOpen((LPSTR)lpszSoundName, NULL, 
+		MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
+	if (hmmio == 0) {
 		printf("sndPlaySound // searching in SystemSound List !\n");
 		GetProfileString("Sounds", (LPSTR)lpszSoundName, "", str, sizeof(str));
 		if (strlen(str) == 0) return FALSE;
-		if ((ptr = strchr(str, ',')) != NULL) *ptr = '\0';
-		hFile = open(str, O_RDONLY);
-		if (hFile == 0) {
+		if ( (ptr = (LPSTR)strchr(str, ',')) != NULL) *ptr = '\0';
+		hmmio = mmioOpen(str, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
+		if (hmmio == 0) {
 			printf("sndPlaySound // can't find SystemSound='%s' !\n", str);
 			return FALSE;
 			}
 		}
+	if (mmioDescend(hmmio, &ckMainRIFF, NULL, 0) != 0) {
+ErrSND:	if (hmmio != 0)   mmioClose(hmmio, 0);
+		return FALSE;
+		}
+	printf("sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
+				(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
+				ckMainRIFF.cksize);
+	if ((ckMainRIFF.ckid != FOURCC_RIFF) ||
+	    (ckMainRIFF.fccType != mmioFOURCC('W', 'A', 'V', 'E'))) goto ErrSND;
+	mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
+	if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) goto ErrSND;
+	printf("sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
+			(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
+			mmckInfo.cksize);
+	if (mmioRead(hmmio, (HPSTR) &pcmWaveFormat,
+	    (long) sizeof(PCMWAVEFORMAT)) != (long) sizeof(PCMWAVEFORMAT)) goto ErrSND;
+	mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
+	if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) goto ErrSND;
+	printf("sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
+			(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
+			mmckInfo.cksize);
 	WaveDesc.hWave = 0;
-	WaveDesc.lpFormat = (LPWAVEFORMAT)&WaveFormat;
-	WaveFormat.wf.wFormatTag = WAVE_FORMAT_PCM;
-	WaveFormat.wBitsPerSample = 8;
-	WaveFormat.wf.nChannels = 1;
-	WaveFormat.wf.nSamplesPerSec = 11025;
-	WaveFormat.wf.nAvgBytesPerSec = 11025;
-	WaveFormat.wf.nBlockAlign = 1;
+	WaveDesc.lpFormat = (LPWAVEFORMAT)&pcmWaveFormat;
+	pcmWaveFormat.wf.wFormatTag = WAVE_FORMAT_PCM;
+/*	pcmWaveFormat.wBitsPerSample = 8;
+	pcmWaveFormat.wf.nChannels = 1;
+	pcmWaveFormat.wf.nSamplesPerSec = 11025; 
+	pcmWaveFormat.wf.nBlockAlign = 1; */
+	pcmWaveFormat.wf.nAvgBytesPerSec = 
+		pcmWaveFormat.wf.nSamplesPerSec * pcmWaveFormat.wf.nBlockAlign;
 	dwRet = wodMessage(0, WODM_OPEN, 0, (DWORD)&WaveDesc, CALLBACK_NULL);
 	if (dwRet != MMSYSERR_NOERROR) {
 		printf("sndPlaySound // can't open WaveOut device !\n");
-		return FALSE;
+		goto ErrSND;
 		}
 	WaveHdr.lpData = (LPSTR) malloc(64000);
-	WaveHdr.dwBufferLength = 64000;
+	WaveHdr.dwBufferLength = 32000;
 	WaveHdr.dwUser = 0L;
 	WaveHdr.dwFlags = 0L;
 	WaveHdr.dwLoops = 0L;
 	dwRet = wodMessage(0, WODM_PREPARE, 0, (DWORD)&WaveHdr, sizeof(WAVEHDR));
 	if (dwRet != MMSYSERR_NOERROR) {
 		printf("sndPlaySound // can't prepare WaveOut device !\n");
-		return FALSE;
+		free(WaveHdr.lpData);
+		goto ErrSND;
 		}
 	while(TRUE) {
-		count = read(hFile, WaveHdr.lpData, WaveHdr.dwBufferLength);
-		if (count == 0) break;
+		count = mmioRead(hmmio, WaveHdr.lpData, WaveHdr.dwBufferLength);
+		if (count < 1) break;
 		WaveHdr.dwBytesRecorded = count;
 		wodMessage(0, WODM_WRITE, 0, (DWORD)&WaveHdr, sizeof(WAVEHDR));
 		}
 	wodMessage(0, WODM_UNPREPARE, 0, (DWORD)&WaveHdr, sizeof(WAVEHDR));
 	wodMessage(0, WODM_CLOSE, 0, 0L, 0L);
 	free(WaveHdr.lpData);
-	close(hFile);
-
+	if (hmmio != 0)   mmioClose(hmmio, 0);
 	return TRUE;
 }
 
@@ -561,6 +589,7 @@
 BOOL WINAPI mciDriverNotify(HWND hWndCallBack, UINT wDevID, UINT wStatus)
 {
 	printf("mciDriverNotify(%04X, %u, %04X)\n", hWndCallBack, wDevID, wStatus);
+	if (!IsWindow(hWndCallBack)) return FALSE;
 	PostMessage(hWndCallBack, MM_MCINOTIFY, wStatus, 
 			MAKELONG(mciDrv[wDevID].wDeviceID, 0));
 	return TRUE;
@@ -1653,6 +1682,10 @@
 		if (lpTimer->wCurTime == 0) {
 			lpTimer->wCurTime = lpTimer->wDelay;
 			if (lpTimer->lpFunc != NULL) {
+#ifdef DEBUG_MMTIME
+				printf("MMSysTimeCallback // before CallBack16 !\n");
+				fflush(stdout);
+#endif
 #ifdef WINELIB
 				(*lpTimer->lpFunc)(lpTimer->wTimerID, (WORD)0, 
 						lpTimer->dwUser, (DWORD)0, (DWORD)0);
@@ -1661,12 +1694,17 @@
 					0, (int)lpTimer->wTimerID, 0, (int)0, 
 					2, lpTimer->dwUser, 2, 0, 2, 0);
 #endif
+#ifdef DEBUG_MMTIME
+				printf("MMSysTimeCallback // after CallBack16 !\n");
+				fflush(stdout);
+#endif
 				}
 			if (lpTimer->wFlags & TIME_ONESHOT)
 				timeKillEvent(lpTimer->wTimerID);
 			}
 		lpTimer = lpTimer->Next;
 		}
+	return 0;
 }
 
 /**************************************************************************
@@ -1727,12 +1765,12 @@
 		lpTimer->Next == lpNewTimer;
 		lpNewTimer->Prev == lpTimer;
 		}
-	lpNewTimer->Next == NULL;
+	lpNewTimer->Next = NULL;
 	lpNewTimer->wTimerID = wNewID + 1;
 	lpNewTimer->wCurTime = wDelay;
 	lpNewTimer->wDelay = wDelay;
 	lpNewTimer->wResol = wResol;
-	lpNewTimer->lpFunc = lpFunc;
+	lpNewTimer->lpFunc = (FARPROC)lpFunc;
 	lpNewTimer->dwUser = dwUser;
 	lpNewTimer->wFlags = wFlags;
 	return lpNewTimer->wTimerID;
@@ -1801,9 +1839,20 @@
 HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo, DWORD dwOpenFlags)
 {
 	int		hFile;
+	HANDLE	hmmio;
+	OFSTRUCT	ofs;
+	LPMMIOINFO	lpmminfo;
 	printf("mmioOpen('%s', %08X, %08X);\n", szFileName, lpmmioinfo, dwOpenFlags);
-	hFile = _lopen(szFileName, dwOpenFlags);
-	return (HMMIO)hFile;
+	hFile = OpenFile(szFileName, &ofs, dwOpenFlags);
+	if (hFile == -1) return 0;
+	hmmio = GlobalAlloc(GMEM_MOVEABLE, sizeof(MMIOINFO));
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	memset(lpmminfo, 0, sizeof(MMIOINFO));
+	lpmminfo->hmmio = hmmio;
+	lpmminfo->dwReserved2 = MAKELONG(hFile, 0);
+	GlobalUnlock(hmmio);
+	return (HMMIO)hmmio;
 }
 
 
@@ -1813,8 +1862,13 @@
 */
 UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags)
 {
+	LPMMIOINFO	lpmminfo;
 	printf("mmioClose(%04X, %04X);\n", hmmio, uFlags);
-	_lclose(hmmio);
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	_lclose(LOWORD(lpmminfo->dwReserved2));
+	GlobalUnlock(hmmio);
+	GlobalFree(hmmio);
 	return 0;
 }
 
@@ -1825,9 +1879,16 @@
 */
 LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch)
 {
-	printf("mmioRead\n");
-	_lread(hmmio, pch, cch);
-	return 0;
+	int		count;
+	LPMMIOINFO	lpmminfo;
+#ifdef DEBUG_MMIO
+	printf("mmioRead(%04X, %08X, %ld);\n", hmmio, pch, cch);
+#endif
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	count = _lread(LOWORD(lpmminfo->dwReserved2), pch, cch);
+	GlobalUnlock(hmmio);
+	return count;
 }
 
 
@@ -1837,8 +1898,14 @@
 */
 LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch)
 {
-	printf("mmioWrite\n");
-	return 0;
+	int		count;
+	LPMMIOINFO	lpmminfo;
+	printf("mmioWrite(%04X, %08X, %ld);\n", hmmio, pch, cch);
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	count = _lwrite(LOWORD(lpmminfo->dwReserved2), (LPSTR)pch, cch);
+	GlobalUnlock(hmmio);
+	return count;
 }
 
 /**************************************************************************
@@ -1846,8 +1913,14 @@
 */
 LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin)
 {
-	printf("mmioSeek\n");
-	return 0;
+	int		count;
+	LPMMIOINFO	lpmminfo;
+	printf("mmioSeek(%04X, %08X, %d);\n", hmmio, lOffset, iOrigin);
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	count = _llseek(LOWORD(lpmminfo->dwReserved2), lOffset, iOrigin);
+	GlobalUnlock(hmmio);
+	return count;
 }
 
 /**************************************************************************
@@ -1855,16 +1928,25 @@
 */
 UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags)
 {
+	LPMMIOINFO	lpmminfo;
 	printf("mmioGetInfo\n");
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	memcpy(lpmmioinfo, lpmminfo, sizeof(MMIOINFO));
+	GlobalUnlock(hmmio);
 	return 0;
 }
 
 /**************************************************************************
-* 				mmioGetInfo			[MMSYSTEM.1216]
+* 				mmioSetInfo			[MMSYSTEM.1216]
 */
 UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags)
 {
+	LPMMIOINFO	lpmminfo;
 	printf("mmioSetInfo\n");
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	GlobalUnlock(hmmio);
 	return 0;
 }
 
@@ -1883,7 +1965,11 @@
 */
 UINT WINAPI mmioFlush(HMMIO hmmio, UINT uFlags)
 {
-	printf("mmioFlush\n");
+	LPMMIOINFO	lpmminfo;
+	printf("mmioFlush(%04X, %04X)\n", hmmio, uFlags);
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	GlobalUnlock(hmmio);
 	return 0;
 }
 
@@ -1892,7 +1978,22 @@
 */
 UINT WINAPI mmioAdvance(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags)
 {
+	int		count = 0;
+	LPMMIOINFO	lpmminfo;
 	printf("mmioAdvance\n");
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	if (uFlags == MMIO_READ) {
+		count = _lread(LOWORD(lpmminfo->dwReserved2), 
+			lpmmioinfo->pchBuffer, lpmmioinfo->cchBuffer);
+		}
+	if (uFlags == MMIO_WRITE) {
+		count = _lwrite(LOWORD(lpmminfo->dwReserved2),
+			lpmmioinfo->pchBuffer, lpmmioinfo->cchBuffer);
+		}
+	lpmmioinfo->pchNext	+= count;
+	GlobalUnlock(hmmio);
+	lpmminfo->lDiskOffset = _llseek(LOWORD(lpmminfo->dwReserved2), 0, SEEK_CUR);
 	return 0;
 }
 
@@ -1931,7 +2032,66 @@
 UINT WINAPI mmioDescend(HMMIO hmmio, MMCKINFO FAR* lpck,
 		    const MMCKINFO FAR* lpckParent, UINT uFlags)
 {
-	printf("mmioDescend\n");
+	DWORD	dwfcc, dwOldPos;
+	LPMMIOINFO	lpmminfo;
+#ifdef DEBUG_MMIO
+	printf("mmioDescend(%04X, %08X, %08X, %04X);\n", 
+				hmmio, lpck, lpckParent, uFlags);
+#endif
+	if (lpck == NULL) return 0;
+	lpmminfo = (LPMMIOINFO)GlobalLock(hmmio);
+	if (lpmminfo == NULL) return 0;
+	dwfcc = lpck->ckid;
+	dwOldPos = _llseek(LOWORD(lpmminfo->dwReserved2), 0, SEEK_CUR);
+	if (lpckParent != NULL) {
+#ifdef DEBUG_MMIO
+		printf("mmioDescend // seek inside parent at %ld !\n", lpckParent->dwDataOffset);
+#endif
+		dwOldPos = _llseek(LOWORD(lpmminfo->dwReserved2), 
+					lpckParent->dwDataOffset, SEEK_SET);
+		}
+	if ((uFlags & MMIO_FINDCHUNK) || (uFlags & MMIO_FINDRIFF) || 
+		(uFlags & MMIO_FINDLIST)) {
+#ifdef DEBUG_MMIO
+		printf("mmioDescend // MMIO_FINDxxxx dwfcc=%08X !\n", dwfcc);
+#endif
+		while (TRUE) {
+			if (_lread(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck, 
+					sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
+				_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
+				GlobalUnlock(hmmio);
+				return MMIOERR_CHUNKNOTFOUND;
+				}
+#ifdef DEBUG_MMIO
+			printf("mmioDescend // dwfcc=%08X ckid=%08X cksize=%08X !\n", 
+									dwfcc, lpck->ckid, lpck->cksize);
+#endif
+			if (dwfcc == lpck->ckid) break;
+			dwOldPos += lpck->cksize + 2 * sizeof(DWORD);
+			if (lpck->ckid == FOURCC_RIFF || lpck->ckid == FOURCC_LIST) 
+				dwOldPos += sizeof(DWORD);
+			_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
+			}
+		}
+	else {
+		if (_lread(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck, 
+				sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
+			_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
+			GlobalUnlock(hmmio);
+			return MMIOERR_CHUNKNOTFOUND;
+			}
+		}
+	GlobalUnlock(hmmio);
+	lpck->dwDataOffset = dwOldPos + 2 * sizeof(DWORD);
+	if (lpck->ckid == FOURCC_RIFF || lpck->ckid == FOURCC_LIST) 
+		lpck->dwDataOffset += sizeof(DWORD);
+	lpmminfo->lDiskOffset = _llseek(LOWORD(lpmminfo->dwReserved2), 
+									lpck->dwDataOffset, SEEK_SET);
+#ifdef DEBUG_MMIO
+	printf("mmioDescend // lpck->ckid=%08X lpck->cksize=%ld !\n", 
+								lpck->ckid, lpck->cksize);
+	printf("mmioDescend // lpck->fccType=%08X !\n", lpck->fccType);
+#endif
 	return 0;
 }
 
@@ -2018,5 +2178,5 @@
 }
 
 
+#endif /* #ifdef WINELIB */
 
-#endif
diff --git a/miscemu/Imakefile b/miscemu/Imakefile
index 27798bb..7caac55 100644
--- a/miscemu/Imakefile
+++ b/miscemu/Imakefile
@@ -5,12 +5,14 @@
 SRCS = \
 	emulate.c \
 	int10.c \
+	int13.c \
 	int15.c \
 	int16.c \
 	int1a.c \
 	int21.c \
 	int25.c \
 	int26.c \
+	int2a.c \
 	int2f.c \
 	int31.c \
 	ioports.c \
diff --git a/miscemu/int13.c b/miscemu/int13.c
new file mode 100644
index 0000000..55fb5b2
--- /dev/null
+++ b/miscemu/int13.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "msdos.h"
+#include "wine.h"
+
+int do_int13(struct sigcontext_struct *context)
+{
+	switch((context->sc_eax >> 8) & 0xff)
+	{
+	case 0x00:                            /* RESET DISK SYSTEM     */
+	case 0x04:                            /* VERIFY DISK SECTOR(S) */
+		EAX = (EAX & 0xffff00ff);
+		break;
+	       
+	case 0x05:                                     /* FORMAT TRACK */
+		EAX = (EAX & 0xffff00ff) | 0x0c;
+		SetCflag;
+		break;
+
+	case 0x06:             /* FORMAT TRACK AND SET BAD SECTOR FLAGS */
+	case 0x07:             /* FORMAT DRIVE STARTING AT GIVEN TRACK  */ 
+		EAX = (EAX & 0xffff00ff) | 0x0c;
+		break;
+
+	case 0x08:                              /* GET DRIVE PARAMETERS  */
+		EAX = (EAX & 0xffff00ff) | ((EDX & 0x00000080)? 0x07: 0x01);
+		SetCflag;
+		break;
+
+        case 0x09:         /* INITIALIZE CONTROLLER WITH DRIVE PARAMETERS */
+	case 0x0c:         /* SEEK TO CYLINDER                            */
+	case 0x0d:         /* RESET HARD DISKS                            */
+	case 0x10:         /* CHECK IF DRIVE READY                        */
+	case 0x11:         /* RECALIBRATE DRIVE                           */
+	case 0x14:         /* CONTROLLER INTERNAL DIAGNOSTIC              */
+		EAX = (EAX & 0xffff00ff);
+		break;
+
+	case 0x0e:                    /* READ SECTOR BUFFER (XT only)      */
+	case 0x0f:                    /* WRITE SECTOR BUFFER (XT only)     */
+        case 0x12:                    /* CONTROLLER RAM DIAGNOSTIC (XT,PS) */
+	case 0x13:                    /* DRIVE DIAGNOSTIC (XT,PS)          */
+		EAX = (EAX & 0xffff00ff) | 0x01;
+		SetCflag;
+		break;
+
+
+
+
+	default:
+		IntBarf(0x13, context);
+	};
+	return 1;
+}
diff --git a/miscemu/int1a.c b/miscemu/int1a.c
index 235138e..95b19bd 100644
--- a/miscemu/int1a.c
+++ b/miscemu/int1a.c
@@ -3,6 +3,7 @@
 #include <stdlib.h>
 #include "msdos.h"
 #include "wine.h"
+#include "options.h"
 
 #ifdef linux
 #include <linux/sched.h> /* needed for HZ */
@@ -16,6 +17,12 @@
 	struct tm *bdtime;
 	int ticks;
 
+    if (Options.relay_debug) {
+	printf("int1A: AX %04x, BX %04x, CX %04x, DX %04x, "
+	       "SI %04x, DI %04x, DS %04x, ES %04x\n",
+	       AX, BX, CX, DX, SI, DI, DS, ES);
+    }
+
 	switch((context->sc_eax >> 8) & 0xff){
 	case 0:
 		ltime = time(NULL);
@@ -23,6 +30,7 @@
 		context->sc_ecx = ticks >> 16;
 		context->sc_edx = ticks & 0x0000FFFF;
 		context->sc_eax = 0;  /* No midnight rollover */
+		printf("int1a_00 // ltime=%ld ticks=%ld\n", ltime, ticks);
 		break;
 		
 	case 2: 
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 3cc4080..2485f59 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -1169,7 +1169,16 @@
               case 0x00:
                 ioctlGetDeviceInfo(context);
 		break;
-		                
+		   
+	      case 0x09:   /* CHECK IF BLOCK DEVICE REMOTE */
+		EDX = (EDX & 0xffff0000) | (1<<9) | (1<<12);
+		ResetCflag;
+		break;
+
+	      case 0x0b:   /* SET SHARING RETRY COUNT */
+		ResetCflag;
+		break;
+
               case 0x0d:
                 ioctlGenericBlkDevReq(context);
                 break;
@@ -1364,6 +1373,9 @@
 	    ResetCflag;
 	    break;		
 
+	  case 0xea: /* NOVELL NETWARE - RETURN SHELL VERSION */
+	    break;
+
 	  default:
             IntBarf(0x21, context);
 	    return 1;
diff --git a/miscemu/int2a.c b/miscemu/int2a.c
new file mode 100644
index 0000000..ba25c2f
--- /dev/null
+++ b/miscemu/int2a.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "msdos.h"
+#include "wine.h"
+
+int do_int2a(struct sigcontext_struct *context)
+{
+	switch((context->sc_eax >> 8) & 0xff)
+	{
+	case 0x00:                             /* NETWORK INSTALLATION CHECK */
+		break;
+		
+	default:
+		IntBarf(0x2a, context);
+	};
+	return 1;
+}
diff --git a/miscemu/int2f.c b/miscemu/int2f.c
index 046337c..c652bba 100644
--- a/miscemu/int2f.c
+++ b/miscemu/int2f.c
@@ -10,6 +10,10 @@
 {
 	switch((context->sc_eax >> 8) & 0xff)
 	{
+	case 0x10: /* share isn't installed */
+	        EAX = (EAX & 0xffffff00) | 0x01;
+		break;
+
 	case 0x15: /* mscdex */
 		/* ignore requests */
 		return 1;
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 8ae88a0..1adc1e3 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -14,6 +14,9 @@
 #include "user.h"
 #include "syscolor.h"
 
+  /* Last COLOR id */
+#define COLOR_MAX   COLOR_BTNHIGHLIGHT
+
 extern LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn );
 extern LONG NC_HandleNCActivate( HWND hwnd, WORD wParam );
 extern LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params );
@@ -149,7 +152,16 @@
 	{
 	    if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 1;
 	    if (!classPtr->wc.hbrBackground) return 1;
-	    FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
+            if (classPtr->wc.hbrBackground <= COLOR_MAX+1)
+            {
+                 HBRUSH hbrush;
+                 hbrush = CreateSolidBrush(
+                     GetSysColor(classPtr->wc.hbrBackground-1));
+                 FillWindow( GetParent(hwnd), hwnd, (HDC)wParam, hbrush);
+                 DeleteObject (hbrush);
+            }
+            else
+	         FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
 		        classPtr->wc.hbrBackground );
 	    return 0;
 	}
diff --git a/windows/dialog.c b/windows/dialog.c
index 47ad5b4..e91d95a 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -54,8 +54,10 @@
 static DLGCONTROLHEADER * DIALOG_GetControl( DLGCONTROLHEADER * ptr,
 					     char ** class, char ** text )
 {
+    int i;
     unsigned char * p = (unsigned char *)ptr;
     p += 14;  /* size of control header */
+
     if (*p & 0x80)
     {
 	switch(*p++)
@@ -74,8 +76,15 @@
 	*class = p;
 	p += strlen(p) + 1;
     }
-    *text = p;
-    p += strlen(p) + 2;
+/* FIXME: how can I determine if the resource id is an integer or a string ? */
+    if (*p == 0xff) { 
+/*	*(DWORD*)text = (*p << 8) | *p;*/
+	*(DWORD*)text = 0xebeb;
+	p += 4;
+    } else {
+	*text = p;
+	p += strlen(p) + 2;
+    }
     return (DLGCONTROLHEADER *)p;
 }
 
@@ -285,9 +294,14 @@
 	next_header = DIALOG_GetControl( header, &class, &text );
 
 #ifdef DEBUG_DIALOG
-	printf( "   %s '%s' %d, %d, %d, %d, %d, %08x\n",
-	        class, text, header->id, header->x, header->y, header->cx,
-	        header->cy, header->style );
+	printf( "   %s ", class);
+	if ((DWORD*)text < 0x10000)
+		printf("'%4X'", (DWORD*)text);
+	else
+		printf("'%s'", text);
+	
+	printf(" %d, %d, %d, %d, %d, %08x\n", header->id, header->x, header->y, 
+		header->cx, header->cy, header->style );
 #endif
 	if ((strcmp(class, "STATIC") == 0) & ((header->style & SS_ICON) == SS_ICON)) {
 	    header->cx = 32;
diff --git a/windows/event.c b/windows/event.c
index 04358df..4b6b3fd 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -44,6 +44,7 @@
 BYTE AsyncKeyStateTable[256];
 static WORD ALTKeyState;
 static HWND captureWnd = 0;
+static BOOL	InputEnabled = TRUE;
 Window winHasCursor = 0;
 
 /* Keyboard translation tables */
@@ -517,3 +518,16 @@
 {
     return captureWnd;
 }
+
+
+/**********************************************************************
+ *			EnableHardwareInput 		[USER.331]
+ */
+BOOL EnableHardwareInput(BOOL bEnable)
+{
+	BOOL bOldState = InputEnabled;
+	printf("EMPTY STUB !!! EnableHardwareInput(%d);\n", bEnable);
+	InputEnabled = bEnable;
+    return (bOldState && !bEnable);
+}
+
diff --git a/windows/message.c b/windows/message.c
index dfafcde..dcb8e5c 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -21,6 +21,8 @@
 #include "sysmetrics.h"
 #include "hook.h"
 
+#define HWND_BROADCAST  ((HWND)0xffff)
+
 #define MAX_QUEUE_SIZE   120  /* Max. size of a message queue */
 
 
@@ -115,8 +117,10 @@
     pos = msgQueue->nextFreeMessage;
 
       /* Check if queue is full */
-    if ((pos == msgQueue->nextMessage) && (msgQueue->msgCount > 0))
-	return FALSE;
+    if ((pos == msgQueue->nextMessage) && (msgQueue->msgCount > 0)) {
+		printf("MSG_AddMsg // queue is full !\n");
+		return FALSE;
+		}
 
       /* Store message */
     msgQueue->messages[pos].msg = *msg;
@@ -724,16 +728,44 @@
 }
 
 
+
 /***********************************************************************
  *           PostMessage   (USER.110)
  */
 BOOL PostMessage( HWND hwnd, WORD message, WORD wParam, LONG lParam )
 {
-    MSG msg;
-    WND *wndPtr = WIN_FindWndPtr( hwnd );
+    MSG 	msg;
+    WND 	*wndPtr;
 
+	if (hwnd == HWND_BROADCAST) {
+#ifdef DEBUG_MSG
+		printf("PostMessage // HWND_BROADCAST !\n");
+#endif
+	    hwnd = GetTopWindow(GetDesktopWindow());
+	    while (hwnd) {
+	        if (!(wndPtr = WIN_FindWndPtr(hwnd))) break;
+			if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION) {
+#ifdef DEBUG_MSG
+				printf("BROADCAST Message to hWnd=%04X m=%04X w=%04X l=%08X !\n", 
+							hwnd, message, wParam, lParam);
+#endif
+				PostMessage(hwnd, message, wParam, lParam);
+				}
+/*				{
+				char	str[128];
+				GetWindowText(hwnd, str, sizeof(str));
+				printf("BROADCAST GetWindowText()='%s' !\n", str); 
+				}*/
+			hwnd = wndPtr->hwndNext;
+			}
+#ifdef DEBUG_MSG
+		printf("PostMessage // End of HWND_BROADCAST !\n");
+#endif
+		return TRUE;
+		}
+
+	wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr || !wndPtr->hmemTaskQ) return FALSE;
-
     msg.hwnd    = hwnd;
     msg.message = message;
     msg.wParam  = wParam;
@@ -760,6 +792,51 @@
 
 
 /***********************************************************************
+ *           WaitMessage    (USER.112)
+ */
+void WaitMessage( void )
+{
+    MSG msg;
+    LONG nextExp;  /* Next timer expiration time */
+    XEvent event;
+
+    while (XPending( display ))
+    {
+        XNextEvent( display, &event );
+        EVENT_ProcessEvent( &event );
+    }    
+
+    while(1)
+    {
+        if ((appMsgQueue->wPostQMsg) || 
+            (appMsgQueue->status & (QS_SENDMESSAGE | QS_PAINT)) ||
+            (appMsgQueue->msgCount) || (sysMsgQueue->msgCount) )
+            break;
+        if ((appMsgQueue->status & QS_TIMER) && 
+            TIMER_CheckTimer( &nextExp, &msg, 0, FALSE))
+            break;
+        else
+            nextExp=-1;
+
+        if (!XPending( display ) && (nextExp != -1))
+        {
+            fd_set read_set;
+            struct timeval timeout;
+            int fd = ConnectionNumber(display);
+            FD_ZERO( &read_set );
+            FD_SET( fd, &read_set );
+            timeout.tv_sec = nextExp / 1000;
+            timeout.tv_usec = (nextExp % 1000) * 1000;
+            if (select( fd+1, &read_set, NULL, NULL, &timeout ) != 1)
+                continue;  /* On timeout or error, restart from the start */
+        }
+        XNextEvent( display, &event );
+        EVENT_ProcessEvent( &event );
+    }
+}
+
+
+/***********************************************************************
  *           TranslateMessage   (USER.113)
  */
 BOOL TranslateMessage( LPMSG msg )
@@ -851,10 +928,12 @@
  */
 WORD RegisterWindowMessage( LPCSTR str )
 {
+	WORD	wRet;
 #ifdef DEBUG_MSG
     printf( "RegisterWindowMessage: '%s'\n", str );
 #endif
-    return GlobalAddAtom( str );
+	wRet = GlobalAddAtom( str );
+    return wRet;
 }
 
 
