Release 940804

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.
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;
 }