- rewrite MCI interfaces as Unicode interface (as it should be)
- made some winmm APIs rely on the Unicode version for the core
  implementation (instead of Ansi flavor)

diff --git a/dlls/winmm/Makefile.in b/dlls/winmm/Makefile.in
index 2100c66..fe49038 100644
--- a/dlls/winmm/Makefile.in
+++ b/dlls/winmm/Makefile.in
@@ -5,6 +5,7 @@
 VPATH     = @srcdir@
 MODULE    = winmm.dll
 IMPORTS   = user32 advapi32 kernel32 ntdll
+EXTRALIBS = $(LIBUNICODE)
 
 C_SRCS = \
 	driver.c \
diff --git a/dlls/winmm/driver.c b/dlls/winmm/driver.c
index 673f702..c4a52a5 100644
--- a/dlls/winmm/driver.c
+++ b/dlls/winmm/driver.c
@@ -1,5 +1,3 @@
-/* -*- tab-width: 8; c-basic-offset: 4 -*- */
-
 /*
  * WINE Drivers functions
  *
@@ -33,15 +31,16 @@
 #include "mmddk.h"
 #include "winemm.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(driver);
 
-#define HKLM_BASE "Software\\Microsoft\\Windows NT\\CurrentVersion"
-
 static LPWINE_DRIVER   lpDrvItemList  /* = NULL */;
+static const WCHAR HKLM_BASE[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
+                                  'W','i','n','d','o','w','s',' ','N','T','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',0};
 
 WINE_MMTHREAD*  (*pFnGetMMThread16)(UINT16 h) /* = NULL */;
-LPWINE_DRIVER   (*pFnOpenDriver16)(LPCSTR,LPCSTR,LPARAM) /* = NULL */;
+LPWINE_DRIVER   (*pFnOpenDriver16)(LPCWSTR,LPCWSTR,LPARAM) /* = NULL */;
 LRESULT         (*pFnCloseDriver16)(UINT16,LPARAM,LPARAM) /* = NULL */;
 LRESULT         (*pFnSendMessage16)(UINT16,UINT,LPARAM,LPARAM) /* = NULL */;
 
@@ -207,16 +206,19 @@
  *				DRIVER_GetLibName		[internal]
  *
  */
-BOOL	DRIVER_GetLibName(LPCSTR keyName, LPCSTR sectName, LPSTR buf, int sz)
+BOOL	DRIVER_GetLibName(LPCWSTR keyName, LPCWSTR sectName, LPWSTR buf, int sz)
 {
     HKEY	hKey, hSecKey;
     DWORD	bufLen, lRet;
+    static const WCHAR wszSystemIni[] = {'S','Y','S','T','E','M','.','I','N','I',0};
+    WCHAR       wsznull = '\0';
 
-    lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_BASE, 0, KEY_QUERY_VALUE, &hKey);
+    lRet = RegOpenKeyExW(HKEY_LOCAL_MACHINE, HKLM_BASE, 0, KEY_QUERY_VALUE, &hKey);
     if (lRet == ERROR_SUCCESS) {
-	lRet = RegOpenKeyExA(hKey, sectName, 0, KEY_QUERY_VALUE, &hSecKey);
+	lRet = RegOpenKeyExW(hKey, sectName, 0, KEY_QUERY_VALUE, &hSecKey);
 	if (lRet == ERROR_SUCCESS) {
-	    lRet = RegQueryValueExA(hSecKey, keyName, 0, 0, buf, &bufLen);
+            bufLen = sz;
+	    lRet = RegQueryValueExW(hSecKey, keyName, 0, 0, (void*)buf, &bufLen);
 	    RegCloseKey( hSecKey );
 	}
         RegCloseKey( hKey );
@@ -224,7 +226,7 @@
     if (lRet == ERROR_SUCCESS) return TRUE;
     /* default to system.ini if we can't find it in the registry,
      * to support native installations where system.ini is still used */
-    return GetPrivateProfileStringA(sectName, keyName, "", buf, sz, "SYSTEM.INI");
+    return GetPrivateProfileStringW(sectName, keyName, &wsznull, buf, sz, wszSystemIni);
 }
 
 /**************************************************************************
@@ -232,16 +234,16 @@
  *
  * Tries to load a 32 bit driver whose DLL's (module) name is fn
  */
-LPWINE_DRIVER	DRIVER_TryOpenDriver32(LPCSTR fn, LPARAM lParam2)
+LPWINE_DRIVER	DRIVER_TryOpenDriver32(LPCWSTR fn, LPARAM lParam2)
 {
     LPWINE_DRIVER 	lpDrv = NULL;
     HMODULE		hModule = 0;
-    LPSTR		ptr;
+    LPWSTR		ptr;
     LPCSTR		cause = 0;
 
-    TRACE("(%s, %08lX);\n", debugstr_a(fn), lParam2);
+    TRACE("(%s, %08lX);\n", debugstr_w(fn), lParam2);
 
-    if ((ptr = strchr(fn, ' ')) != NULL) {
+    if ((ptr = strchrW(fn, ' ')) != NULL) {
 	*ptr++ = '\0';
 	while (*ptr == ' ') ptr++;
 	if (*ptr == '\0') ptr = NULL;
@@ -250,7 +252,7 @@
     lpDrv = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_DRIVER));
     if (lpDrv == NULL) {cause = "OOM"; goto exit;}
 
-    if ((hModule = LoadLibraryA(fn)) == 0) {cause = "Not a 32 bit lib"; goto exit;}
+    if ((hModule = LoadLibraryW(fn)) == 0) {cause = "Not a 32 bit lib"; goto exit;}
 
     lpDrv->d.d32.lpDrvProc = (DRIVERPROC)GetProcAddress(hModule, "DriverProc");
     if (lpDrv->d.d32.lpDrvProc == NULL) {cause = "no DriverProc"; goto exit;}
@@ -290,7 +292,7 @@
  exit:
     FreeLibrary(hModule);
     HeapFree(GetProcessHeap(), 0, lpDrv);
-    TRACE("Unable to load 32 bit module %s: %s\n", debugstr_a(fn), cause);
+    TRACE("Unable to load 32 bit module %s: %s\n", debugstr_w(fn), cause);
     return NULL;
 }
 
@@ -301,23 +303,59 @@
  * (0,1,DRV_ENABLE,0       ,0)
  * (0,1,DRV_OPEN  ,buf[256],0)
  */
-HDRVR WINAPI OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lParam2)
+HDRVR WINAPI OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lParam)
+{
+    INT                 len;
+    LPWSTR 		dn = NULL;
+    LPWSTR 		sn = NULL;
+    HDRVR		ret;
+
+    if (lpDriverName)
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, lpDriverName, -1, NULL, 0 );
+        dn = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+        if (!dn) return 0;
+        MultiByteToWideChar( CP_ACP, 0, lpDriverName, -1, dn, len );
+    }
+
+    if (lpSectionName)
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, lpSectionName, -1, NULL, 0 );
+        sn = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+        if (!sn) return 0;
+        MultiByteToWideChar( CP_ACP, 0, lpSectionName, -1, sn, len );
+    }
+
+    ret = OpenDriver(dn, sn, lParam);
+
+    if (dn) HeapFree(GetProcessHeap(), 0, dn);
+    if (sn) HeapFree(GetProcessHeap(), 0, sn);
+    return ret;
+}
+
+/**************************************************************************
+ *				OpenDriver 		        [WINMM.@]
+ *				DrvOpen				[WINMM.@]
+ */
+HDRVR WINAPI OpenDriver(LPCWSTR lpDriverName, LPCWSTR lpSectionName, LPARAM lParam)
 {
     LPWINE_DRIVER	lpDrv = NULL;
-    char 		libName[128];
-    LPCSTR		lsn = lpSectionName;
+    WCHAR 		libName[128];
+    LPCWSTR		lsn = lpSectionName;
 
-    TRACE("(%s, %s, 0x%08lx);\n", debugstr_a(lpDriverName), debugstr_a(lpSectionName), lParam2);
+    TRACE("(%s, %s, 0x%08lx);\n", 
+          debugstr_w(lpDriverName), debugstr_w(lpSectionName), lParam);
 
     if (lsn == NULL) {
-	lstrcpynA(libName, lpDriverName, sizeof(libName));
+        static const WCHAR wszDrivers32[] = {'D','r','i','v','e','r','s','3','2',0};
+	lstrcpynW(libName, lpDriverName, sizeof(libName) / sizeof(WCHAR));
 
-	if ((lpDrv = DRIVER_TryOpenDriver32(libName, lParam2)))
+	if ((lpDrv = DRIVER_TryOpenDriver32(libName, lParam)))
 	    goto the_end;
-	lsn = "Drivers32";
+	lsn = wszDrivers32;
     }
     if (DRIVER_GetLibName(lpDriverName, lsn, libName, sizeof(libName)) &&
-	(lpDrv = DRIVER_TryOpenDriver32(libName, lParam2)))
+	(lpDrv = DRIVER_TryOpenDriver32(libName, lParam)))
 	goto the_end;
 
     /* now we will try a 16 bit driver (and add all the glue to make it work... which
@@ -326,12 +364,13 @@
      */
     WINMM_CheckForMMSystem();
     if (pFnOpenDriver16 &&
-        (lpDrv = pFnOpenDriver16(lpDriverName, lpSectionName, lParam2)))
+        (lpDrv = pFnOpenDriver16(lpDriverName, lpSectionName, lParam)))
     {
-        if (DRIVER_AddToList(lpDrv, 0, lParam2)) goto the_end;
+        if (DRIVER_AddToList(lpDrv, 0, lParam)) goto the_end;
         HeapFree(GetProcessHeap(), 0, lpDrv);
     }
-    TRACE("Failed to open driver %s from system.ini file, section %s\n", debugstr_a(lpDriverName), debugstr_a(lpSectionName));
+    TRACE("Failed to open driver %s from system.ini file, section %s\n", 
+          debugstr_w(lpDriverName), debugstr_w(lpSectionName));
     return 0;
 
  the_end:
@@ -340,40 +379,6 @@
 }
 
 /**************************************************************************
- *				OpenDriver 		        [WINMM.@]
- *				DrvOpen				[WINMM.@]
- */
-HDRVR WINAPI OpenDriverW(LPCWSTR lpDriverName, LPCWSTR lpSectionName, LPARAM lParam)
-{
-    INT                 len;
-    LPSTR 		dn = NULL;
-    LPSTR 		sn = NULL;
-    HDRVR		ret;
-
-    if (lpDriverName)
-    {
-        len = WideCharToMultiByte( CP_ACP, 0, lpDriverName, -1, NULL, 0, NULL, NULL );
-        dn = HeapAlloc( GetProcessHeap(), 0, len );
-        if (!dn) return 0;
-        WideCharToMultiByte( CP_ACP, 0, lpDriverName, -1, dn, len, NULL, NULL );
-    }
-
-    if (lpSectionName)
-    {
-        len = WideCharToMultiByte( CP_ACP, 0, lpSectionName, -1, NULL, 0, NULL, NULL );
-        sn = HeapAlloc( GetProcessHeap(), 0, len );
-        if (!sn) return 0;
-        WideCharToMultiByte( CP_ACP, 0, lpSectionName, -1, sn, len, NULL, NULL );
-    }
-
-    ret = OpenDriverA(dn, sn, lParam);
-
-    HeapFree(GetProcessHeap(), 0, dn);
-    HeapFree(GetProcessHeap(), 0, sn);
-    return ret;
-}
-
-/**************************************************************************
  *			CloseDriver				[WINMM.@]
  *			DrvClose				[WINMM.@]
  */
diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c
index 1db31ac..4246b46 100644
--- a/dlls/winmm/mci.c
+++ b/dlls/winmm/mci.c
@@ -31,6 +31,15 @@
  * - use a default registry setting to replace the [mci] section in
  *   configuration file (layout of info in registry should be compatible
  *   with all Windows' version - which use different layouts of course)
+ * - implement automatic open
+ *      + only works on string interface, on regular devices (don't work on all
+ *        nor custom devices)
+ * - command table handling isn't thread safe
+ */
+
+/* to be cross checked:
+ * - heapalloc for *sizeof(WCHAR) when needed
+ * - size of string in WCHAR or bytes? (#chars for MCI_INFO, #bytes for MCI_SYSINFO)
  */
 
 #include "config.h"
@@ -49,34 +58,41 @@
 #include "winuser.h"
 #include "winnls.h"
 #include "winreg.h"
+#include "wownt32.h"
 
 #include "digitalv.h"
 #include "winemm.h"
 
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mci);
 
-WINMM_MapType  (*pFnMciMapMsg16To32A)  (WORD,WORD,DWORD*) /* = NULL */;
-WINMM_MapType  (*pFnMciUnMapMsg16To32A)(WORD,WORD,DWORD) /* = NULL */;
-WINMM_MapType  (*pFnMciMapMsg32ATo16)  (WORD,WORD,DWORD,DWORD*) /* = NULL */;
-WINMM_MapType  (*pFnMciUnMapMsg32ATo16)(WORD,WORD,DWORD,DWORD) /* = NULL */;
+WINMM_MapType  (*pFnMciMapMsg16To32W)  (WORD,WORD,DWORD*) /* = NULL */;
+WINMM_MapType  (*pFnMciUnMapMsg16To32W)(WORD,WORD,DWORD) /* = NULL */;
+WINMM_MapType  (*pFnMciMapMsg32WTo16)  (WORD,WORD,DWORD,DWORD*) /* = NULL */;
+WINMM_MapType  (*pFnMciUnMapMsg32WTo16)(WORD,WORD,DWORD,DWORD) /* = NULL */;
 
 /* First MCI valid device ID (0 means error) */
 #define MCI_MAGIC 0x0001
 
 /* MCI settings */
-#define HKLM_MCI "Software\\Microsoft\\Windows NT\\CurrentVersion\\MCI"
+static const WCHAR wszHklmMci  [] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s',' ','N','T','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','M','C','I',0};
+static const WCHAR wszNull     [] = {0};
+static const WCHAR wszAll      [] = {'A','L','L',0};
+static const WCHAR wszMci      [] = {'M','C','I',0};
+static const WCHAR wszOpen     [] = {'o','p','e','n',0};
+static const WCHAR wszSystemIni[] = {'s','y','s','t','e','m','.','i','n','i',0};
 
 /* dup a string and uppercase it */
-inline static LPSTR str_dup_upper( LPCSTR str )
+inline static LPWSTR str_dup_upper( LPCWSTR str )
 {
-    INT len = strlen(str) + 1;
-    LPSTR p = HeapAlloc( GetProcessHeap(), 0, len );
+    INT len = (strlenW(str) + 1) * sizeof(WCHAR);
+    LPWSTR p = HeapAlloc( GetProcessHeap(), 0, len );
     if (p)
     {
         memcpy( p, str, len );
-        CharUpperA( p );
+        CharUpperW( p );
     }
     return p;
 }
@@ -100,7 +116,7 @@
 /**************************************************************************
  * 				MCI_GetDriverFromString		[internal]
  */
-UINT	MCI_GetDriverFromString(LPCSTR lpstrName)
+UINT	MCI_GetDriverFromString(LPCWSTR lpstrName)
 {
     LPWINE_MCIDRIVER	wmd;
     UINT		ret = 0;
@@ -108,20 +124,20 @@
     if (!lpstrName)
 	return 0;
 
-    if (!lstrcmpiA(lpstrName, "ALL"))
+    if (!strcmpiW(lpstrName, wszAll))
 	return MCI_ALL_DEVICE_ID;
 
     EnterCriticalSection(&WINMM_IData->cs);
     for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
-	if (wmd->lpstrElementName && strcmp(wmd->lpstrElementName, lpstrName) == 0) {
+	if (wmd->lpstrElementName && strcmpW(wmd->lpstrElementName, lpstrName) == 0) {
 	    ret = wmd->wDeviceID;
 	    break;
 	}
-	if (wmd->lpstrDeviceType && strcasecmp(wmd->lpstrDeviceType, lpstrName) == 0) {
+	if (wmd->lpstrDeviceType && strcmpiW(wmd->lpstrDeviceType, lpstrName) == 0) {
 	    ret = wmd->wDeviceID;
 	    break;
 	}
-	if (wmd->lpstrAlias && strcasecmp(wmd->lpstrAlias, lpstrName) == 0) {
+	if (wmd->lpstrAlias && strcmpiW(wmd->lpstrAlias, lpstrName) == 0) {
 	    ret = wmd->wDeviceID;
 	    break;
 	}
@@ -134,13 +150,26 @@
 /**************************************************************************
  * 			MCI_MessageToString			[internal]
  */
-const char* MCI_MessageToString(UINT16 wMsg)
+const char* MCI_MessageToString(UINT wMsg)
 {
     static char buffer[100];
 
 #define CASE(s) case (s): return #s
 
     switch (wMsg) {
+        CASE(DRV_LOAD);
+        CASE(DRV_ENABLE);
+        CASE(DRV_OPEN);
+        CASE(DRV_CLOSE);
+        CASE(DRV_DISABLE);
+        CASE(DRV_FREE);
+        CASE(DRV_CONFIGURE);
+        CASE(DRV_QUERYCONFIGURE);
+        CASE(DRV_INSTALL);
+        CASE(DRV_REMOVE);
+        CASE(DRV_EXITSESSION);
+        CASE(DRV_EXITAPPLICATION);
+        CASE(DRV_POWER);
 	CASE(MCI_BREAK);
 	CASE(MCI_CLOSE);
 	CASE(MCI_CLOSE_DRIVER);
@@ -193,23 +222,350 @@
     }
 }
 
+LPWSTR MCI_strdupAtoW( LPCSTR str )
+{
+    LPWSTR ret;
+    INT len;
+
+    if (!str) return NULL;
+    len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
+    ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+    if (ret) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
+    return ret;
+}
+
+LPSTR MCI_strdupWtoA( LPCWSTR str )
+{
+    LPSTR ret;
+    INT len;
+
+    if (!str) return NULL;
+    len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
+    ret = HeapAlloc( GetProcessHeap(), 0, len );
+    if (ret) WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL );
+    return ret;
+}
+
+static int MCI_MapMsgAtoW(UINT msg, DWORD_PTR dwParam1, DWORD_PTR *dwParam2)
+{
+    if (msg < DRV_RESERVED) return 0;
+
+    switch (msg)
+    {
+    case MCI_CLOSE:
+    case MCI_CONFIGURE:
+    case MCI_PLAY:
+    case MCI_SEEK:
+    case MCI_STOP:
+    case MCI_PAUSE:
+    case MCI_GETDEVCAPS:
+    case MCI_SPIN:
+    case MCI_SET:
+    case MCI_STEP:
+    case MCI_RECORD:
+    case MCI_BREAK:
+    case MCI_SOUND:
+    case MCI_STATUS:
+    case MCI_CUE:
+    case MCI_REALIZE:
+    case MCI_PUT:
+    case MCI_WHERE:
+    case MCI_FREEZE:
+    case MCI_UNFREEZE:
+    case MCI_CUT:
+    case MCI_COPY:
+    case MCI_PASTE:
+    case MCI_UPDATE:
+    case MCI_RESUME:
+    case MCI_DELETE:
+        return 0;
+
+    case MCI_OPEN:
+        {
+            MCI_OPEN_PARMSA *mci_openA = (MCI_OPEN_PARMSA*)*dwParam2;
+            MCI_OPEN_PARMSW *mci_openW;
+            DWORD_PTR *ptr;
+
+            ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD_PTR) + sizeof(*mci_openW) + 2 * sizeof(DWORD));
+            if (!ptr) return -1;
+
+            *ptr++ = *dwParam2; /* save the previous pointer */
+            *dwParam2 = (DWORD_PTR)ptr;
+            mci_openW = (MCI_OPEN_PARMSW *)ptr;
+
+            if (dwParam1 & MCI_NOTIFY)
+                mci_openW->dwCallback = mci_openA->dwCallback;
+
+            if (dwParam1 & MCI_OPEN_TYPE)
+            {
+                if (dwParam1 & MCI_OPEN_TYPE_ID)
+                    mci_openW->lpstrDeviceType = (LPWSTR)mci_openA->lpstrDeviceType;
+                else
+                    mci_openW->lpstrDeviceType = MCI_strdupAtoW(mci_openA->lpstrDeviceType);
+            }
+            if (dwParam1 & MCI_OPEN_ELEMENT)
+            {
+                if (dwParam1 & MCI_OPEN_ELEMENT_ID)
+                    mci_openW->lpstrElementName = (LPWSTR)mci_openA->lpstrElementName;
+                else
+                    mci_openW->lpstrElementName = MCI_strdupAtoW(mci_openA->lpstrElementName);
+            }
+            if (dwParam1 & MCI_OPEN_ALIAS)
+                mci_openW->lpstrAlias = MCI_strdupAtoW(mci_openA->lpstrAlias);
+            /* FIXME: this is only needed for specific types of MCI devices, and
+             * may cause a segfault if the two DWORD:s don't exist at the end of 
+             * mci_openA
+             */
+            memcpy(mci_openW + 1, mci_openA + 1, 2 * sizeof(DWORD));
+        }
+        return 1;
+
+    case MCI_WINDOW:
+        if (dwParam1 & MCI_ANIM_WINDOW_TEXT)
+        {
+            MCI_ANIM_WINDOW_PARMSA *mci_windowA = (MCI_ANIM_WINDOW_PARMSA *)*dwParam2;
+            MCI_ANIM_WINDOW_PARMSW *mci_windowW;
+
+            mci_windowW = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_windowW));
+            if (!mci_windowW) return -1;
+
+            *dwParam2 = (DWORD_PTR)mci_windowW;
+
+            mci_windowW->lpstrText = MCI_strdupAtoW(mci_windowA->lpstrText);
+
+            if (dwParam1 & MCI_NOTIFY)
+                mci_windowW->dwCallback = mci_windowA->dwCallback;
+            if (dwParam1 & MCI_ANIM_WINDOW_HWND)
+                mci_windowW->hWnd = mci_windowA->hWnd;
+            if (dwParam1 & MCI_ANIM_WINDOW_STATE)
+                mci_windowW->nCmdShow = mci_windowA->nCmdShow;
+
+            return 1;
+        }
+        return 0;
+
+    case MCI_SYSINFO:
+        {
+            MCI_SYSINFO_PARMSA *mci_sysinfoA = (MCI_SYSINFO_PARMSA *)*dwParam2;
+            MCI_SYSINFO_PARMSW *mci_sysinfoW;
+            DWORD_PTR *ptr;
+
+            ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_sysinfoW) + sizeof(DWORD_PTR));
+            if (!ptr) return -1;
+
+            *ptr++ = *dwParam2; /* save the previous pointer */
+            *dwParam2 = (DWORD_PTR)ptr;
+            mci_sysinfoW = (MCI_SYSINFO_PARMSW *)ptr;
+
+            if (dwParam1 & MCI_NOTIFY)
+                mci_sysinfoW->dwCallback = mci_sysinfoA->dwCallback;
+
+            mci_sysinfoW->dwRetSize = mci_sysinfoA->dwRetSize;
+            mci_sysinfoW->lpstrReturn = HeapAlloc(GetProcessHeap(), 0, mci_sysinfoW->dwRetSize);
+            mci_sysinfoW->dwNumber = mci_sysinfoA->dwNumber;
+            mci_sysinfoW->wDeviceType = mci_sysinfoA->wDeviceType;
+            return 1;
+        }
+    case MCI_INFO:
+        {
+            MCI_INFO_PARMSA *mci_infoA = (MCI_INFO_PARMSA *)*dwParam2;
+            MCI_INFO_PARMSW *mci_infoW;
+            DWORD_PTR *ptr;
+
+            ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_infoW) + sizeof(DWORD_PTR));
+            if (!ptr) return -1;
+
+            *ptr++ = *dwParam2; /* save the previous pointer */
+            *dwParam2 = (DWORD_PTR)ptr;
+            mci_infoW = (MCI_INFO_PARMSW *)ptr;
+
+            if (dwParam1 & MCI_NOTIFY)
+                mci_infoW->dwCallback = mci_infoA->dwCallback;
+
+            mci_infoW->dwRetSize = mci_infoA->dwRetSize * sizeof(WCHAR); /* it's not the same as SYSINFO !!! */
+            mci_infoW->lpstrReturn = HeapAlloc(GetProcessHeap(), 0, mci_infoW->dwRetSize);
+            return 1;
+        }
+    case MCI_SAVE:
+        {
+            MCI_SAVE_PARMSA *mci_saveA = (MCI_SAVE_PARMSA *)*dwParam2;
+            MCI_SAVE_PARMSW *mci_saveW;
+
+            mci_saveW = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_saveW));
+            if (!mci_saveW) return -1;
+
+            *dwParam2 = (DWORD_PTR)mci_saveW;
+            if (dwParam1 & MCI_NOTIFY)
+                mci_saveW->dwCallback = mci_saveA->dwCallback;
+            mci_saveW->lpfilename = MCI_strdupAtoW(mci_saveA->lpfilename);
+            return 1;
+        }
+    case MCI_LOAD:
+        {
+            MCI_LOAD_PARMSA *mci_loadA = (MCI_LOAD_PARMSA *)*dwParam2;
+            MCI_LOAD_PARMSW *mci_loadW;
+
+            mci_loadW = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_loadW));
+            if (!mci_loadW) return -1;
+
+            *dwParam2 = (DWORD_PTR)mci_loadW;
+            if (dwParam1 & MCI_NOTIFY)
+                mci_loadW->dwCallback = mci_loadA->dwCallback;
+            mci_loadW->lpfilename = MCI_strdupAtoW(mci_loadA->lpfilename);
+            return 1;
+        }
+
+    case MCI_ESCAPE:
+        {
+            MCI_VD_ESCAPE_PARMSA *mci_vd_escapeA = (MCI_VD_ESCAPE_PARMSA *)*dwParam2;
+            MCI_VD_ESCAPE_PARMSW *mci_vd_escapeW;
+
+            mci_vd_escapeW = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_vd_escapeW));
+            if (!mci_vd_escapeW) return -1;
+
+            *dwParam2 = (DWORD_PTR)mci_vd_escapeW;
+            if (dwParam1 & MCI_NOTIFY)
+                mci_vd_escapeW->dwCallback = mci_vd_escapeA->dwCallback;
+            mci_vd_escapeW->lpstrCommand = MCI_strdupAtoW(mci_vd_escapeA->lpstrCommand);
+            return 1;
+        }
+    default:
+        FIXME("Message %s needs translation\n", MCI_MessageToString(msg));
+        return -1;
+    }
+}
+
+static DWORD MCI_UnmapMsgAtoW(UINT msg, DWORD_PTR dwParam1, DWORD_PTR dwParam2,
+                              DWORD result)
+{
+    switch (msg)
+    {
+    case MCI_OPEN:
+        {
+            DWORD_PTR *ptr = (DWORD_PTR *)dwParam2 - 1;
+            MCI_OPEN_PARMSA *mci_openA = (MCI_OPEN_PARMSA *)*ptr;
+            MCI_OPEN_PARMSW *mci_openW = (MCI_OPEN_PARMSW *)(ptr + 1);
+
+            mci_openA->wDeviceID = mci_openW->wDeviceID;
+
+            if (dwParam1 & MCI_OPEN_TYPE)
+            {
+                if (!(dwParam1 & MCI_OPEN_TYPE_ID))
+                    HeapFree(GetProcessHeap(), 0, mci_openW->lpstrDeviceType);
+            }
+            if (dwParam1 & MCI_OPEN_ELEMENT)
+            {
+                if (!(dwParam1 & MCI_OPEN_ELEMENT_ID))
+                    HeapFree(GetProcessHeap(), 0, mci_openW->lpstrElementName);
+            }
+            if (dwParam1 & MCI_OPEN_ALIAS)
+                HeapFree(GetProcessHeap(), 0, mci_openW->lpstrAlias);
+            HeapFree(GetProcessHeap(), 0, ptr);
+        }
+        break;
+    case MCI_WINDOW:
+        if (dwParam1 & MCI_ANIM_WINDOW_TEXT)
+        {
+            MCI_ANIM_WINDOW_PARMSW *mci_windowW = (MCI_ANIM_WINDOW_PARMSW *)dwParam2;
+
+            HeapFree(GetProcessHeap(), 0, (void*)mci_windowW->lpstrText);
+            HeapFree(GetProcessHeap(), 0, mci_windowW);
+        }
+        break;
+
+    case MCI_SYSINFO:
+        {
+            DWORD_PTR *ptr = (DWORD_PTR *)dwParam2 - 1;
+            MCI_SYSINFO_PARMSA *mci_sysinfoA = (MCI_SYSINFO_PARMSA *)*ptr;
+            MCI_SYSINFO_PARMSW *mci_sysinfoW = (MCI_SYSINFO_PARMSW *)(ptr + 1);
+
+            if (!result)
+            {
+                mci_sysinfoA->dwNumber = mci_sysinfoW->dwNumber;
+                mci_sysinfoA->wDeviceType = mci_sysinfoW->wDeviceType;
+                if (dwParam1 & MCI_SYSINFO_QUANTITY)
+                    *(DWORD*)mci_sysinfoA->lpstrReturn = *(DWORD*)mci_sysinfoW->lpstrReturn;
+                else
+                    WideCharToMultiByte(CP_ACP, 0,
+                                        mci_sysinfoW->lpstrReturn, mci_sysinfoW->dwRetSize,
+                                        mci_sysinfoA->lpstrReturn, mci_sysinfoA->dwRetSize,
+                                        NULL, NULL);
+            }
+
+            HeapFree(GetProcessHeap(), 0, mci_sysinfoW->lpstrReturn);
+            HeapFree(GetProcessHeap(), 0, ptr);
+        }
+        break;
+    case MCI_INFO:
+        {
+            DWORD_PTR *ptr = (DWORD_PTR *)dwParam2 - 1;
+            MCI_INFO_PARMSA *mci_infoA = (MCI_INFO_PARMSA *)*ptr;
+            MCI_INFO_PARMSW *mci_infoW = (MCI_INFO_PARMSW *)(ptr + 1);
+
+            if (!result)
+            {
+                WideCharToMultiByte(CP_ACP, 0,
+                                    mci_infoW->lpstrReturn, mci_infoW->dwRetSize / sizeof(WCHAR),
+                                    mci_infoA->lpstrReturn, mci_infoA->dwRetSize,
+                                    NULL, NULL);
+            }
+
+            HeapFree(GetProcessHeap(), 0, mci_infoW->lpstrReturn);
+            HeapFree(GetProcessHeap(), 0, ptr);
+        }
+        break;
+    case MCI_SAVE:
+        {
+            MCI_SAVE_PARMSW *mci_saveW = (MCI_SAVE_PARMSW *)dwParam2;
+
+            HeapFree(GetProcessHeap(), 0, (void*)mci_saveW->lpfilename);
+            HeapFree(GetProcessHeap(), 0, mci_saveW);
+        }
+        break;
+    case MCI_LOAD:
+        {
+            MCI_LOAD_PARMSW *mci_loadW = (MCI_LOAD_PARMSW *)dwParam2;
+
+            HeapFree(GetProcessHeap(), 0, (void*)mci_loadW->lpfilename);
+            HeapFree(GetProcessHeap(), 0, mci_loadW);
+        }
+        break;
+    case MCI_ESCAPE:
+        {
+            MCI_VD_ESCAPE_PARMSW *mci_vd_escapeW = (MCI_VD_ESCAPE_PARMSW *)dwParam2;
+
+            HeapFree(GetProcessHeap(), 0, (void*)mci_vd_escapeW->lpstrCommand);
+            HeapFree(GetProcessHeap(), 0, mci_vd_escapeW);
+        }
+        break;
+
+    default:
+        FIXME("Message %s needs unmapping\n", MCI_MessageToString(msg));
+        break;
+    }
+
+    return result;
+}
+
 /**************************************************************************
  * 				MCI_GetDevTypeFromFileName	[internal]
  */
-static	DWORD	MCI_GetDevTypeFromFileName(LPCSTR fileName, LPSTR buf, UINT len)
+static	DWORD	MCI_GetDevTypeFromFileName(LPCWSTR fileName, LPCWSTR buf, UINT len)
 {
-    LPSTR	tmp;
+    LPCWSTR	tmp;
     HKEY	hKey;
-
-    if ((tmp = strrchr(fileName, '.'))) {
-	if (RegOpenKeyExA( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\MCI Extensions",
+    static const WCHAR keyW[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\',
+                                 'W','i','n','d','o','w','s',' ','N','T','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+                                 'M','C','I',' ','E','x','t','e','n','s','i','o','n','s',0};
+    if ((tmp = strrchrW(fileName, '.'))) {
+	if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, keyW,
 			   0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS) {
 	    DWORD dwLen = len;
-	    LONG lRet = RegQueryValueExA( hKey, tmp + 1, 0, 0, buf, &dwLen ); 
+	    LONG lRet = RegQueryValueExW( hKey, tmp + 1, 0, 0, (void*)buf, &dwLen ); 
 	    RegCloseKey( hKey );
 	    if (lRet == ERROR_SUCCESS) return 0;
         }
-	TRACE("No ...\\MCI Extensions entry for '%s' found.\n", tmp);
+	TRACE("No ...\\MCI Extensions entry for %s found.\n", debugstr_w(tmp));
     }
     return MCIERR_EXTENSION_NOT_FOUND;
 }
@@ -219,9 +575,9 @@
 
 typedef struct tagWINE_MCICMDTABLE {
     UINT		uDevType;
-    LPCSTR		lpTable;
+    const BYTE*		lpTable;
     UINT		nVerbs;		/* number of verbs in command table */
-    LPCSTR*		aVerbs;		/* array of verbs to speed up the verb look up process */
+    LPCWSTR*		aVerbs;		/* array of verbs to speed up the verb look up process */
 } WINE_MCICMDTABLE, *LPWINE_MCICMDTABLE;
 
 static WINE_MCICMDTABLE S_MciCmdTable[MAX_MCICMDTABLE];
@@ -231,7 +587,8 @@
  */
 static	BOOL		MCI_IsCommandTableValid(UINT uTbl)
 {
-    LPCSTR	lmem, str;
+    const BYTE* lmem;
+    LPCWSTR     str;
     DWORD	flg;
     WORD	eid;
     int		idx = 0;
@@ -245,28 +602,26 @@
 
     lmem = S_MciCmdTable[uTbl].lpTable;
     do {
-	do {
-	    str = lmem;
-	    lmem += strlen(lmem) + 1;
-	    flg = *(const DWORD*)lmem;
-	    eid = *(const WORD*)(lmem + sizeof(DWORD));
-	    lmem += sizeof(DWORD) + sizeof(WORD);
-	    idx ++;
-	    /* EPP 	    TRACE("cmd='%s' %08lx %04x\n", str, flg, eid); */
-	    switch (eid) {
-	    case MCI_COMMAND_HEAD:	if (!*str || !flg) return FALSE; idx = 0;			break;	/* check unicity of str in table */
-	    case MCI_STRING:            if (inCst) return FALSE;					break;
-	    case MCI_INTEGER:           if (!*str) return FALSE;					break;
-	    case MCI_END_COMMAND:       if (*str || flg || idx == 0) return FALSE; idx = 0;		break;
-	    case MCI_RETURN:		if (*str || idx != 1) return FALSE;				break;
-	    case MCI_FLAG:		if (!*str) return FALSE;					break;
-	    case MCI_END_COMMAND_LIST:	if (*str || flg) return FALSE;	idx = 0;			break;
-	    case MCI_RECT:		if (!*str || inCst) return FALSE;				break;
-	    case MCI_CONSTANT:          if (inCst) return FALSE; inCst = TRUE;				break;
-	    case MCI_END_CONSTANT:	if (*str || flg || !inCst) return FALSE; inCst = FALSE;		break;
-	    default:			return FALSE;
-	    }
-	} while (eid != MCI_END_COMMAND_LIST);
+        str = (LPCWSTR)lmem;
+        lmem += (strlenW(str) + 1) * sizeof(WCHAR);
+        flg = *(const DWORD*)lmem;
+        eid = *(const WORD*)(lmem + sizeof(DWORD));
+        lmem += sizeof(DWORD) + sizeof(WORD);
+        idx ++;
+        /* TRACE("cmd=%s %08lx %04x\n", debugstr_w(str), flg, eid); */
+        switch (eid) {
+        case MCI_COMMAND_HEAD:          if (!*str || !flg) return FALSE; idx = 0;		break;	/* check unicity of str in table */
+        case MCI_STRING:                if (inCst) return FALSE;				break;
+        case MCI_INTEGER:               if (!*str) return FALSE;				break;
+        case MCI_END_COMMAND:           if (*str || flg || idx == 0) return FALSE; idx = 0;	break;
+        case MCI_RETURN:		if (*str || idx != 1) return FALSE;			break;
+        case MCI_FLAG:		        if (!*str) return FALSE;				break;
+        case MCI_END_COMMAND_LIST:	if (*str || flg) return FALSE;	idx = 0;		break;
+        case MCI_RECT:		        if (!*str || inCst) return FALSE;			break;
+        case MCI_CONSTANT:              if (inCst) return FALSE; inCst = TRUE;			break;
+        case MCI_END_CONSTANT:	        if (*str || flg || !inCst) return FALSE; inCst = FALSE; break;
+        default:			return FALSE;
+        }
     } while (eid != MCI_END_COMMAND_LIST);
     return TRUE;
 }
@@ -276,8 +631,8 @@
  */
 static	BOOL		MCI_DumpCommandTable(UINT uTbl)
 {
-    LPCSTR	lmem;
-    LPCSTR	str;
+    const BYTE*	lmem;
+    LPCWSTR	str;
     DWORD	flg;
     WORD	eid;
 
@@ -289,14 +644,14 @@
     lmem = S_MciCmdTable[uTbl].lpTable;
     do {
 	do {
-	    str = lmem;
-	    lmem += strlen(lmem) + 1;
+	    str = (LPCWSTR)lmem;
+	    lmem += (strlenW(str) + 1) * sizeof(WCHAR);
 	    flg = *(const DWORD*)lmem;
 	    eid = *(const WORD*)(lmem + sizeof(DWORD));
-	    TRACE("cmd='%s' %08lx %04x\n", str, flg, eid);
+            /* TRACE("cmd=%s %08lx %04x\n", debugstr_w(str), flg, eid); */
 	    lmem += sizeof(DWORD) + sizeof(WORD);
 	} while (eid != MCI_END_COMMAND && eid != MCI_END_COMMAND_LIST);
-	TRACE(" => end of command%s\n", (eid == MCI_END_COMMAND_LIST) ? " list" : "");
+        /* EPP TRACE(" => end of command%s\n", (eid == MCI_END_COMMAND_LIST) ? " list" : ""); */
     } while (eid != MCI_END_COMMAND_LIST);
     return TRUE;
 }
@@ -308,8 +663,8 @@
 static	UINT		MCI_GetCommandTable(UINT uDevType)
 {
     UINT	uTbl;
-    char	buf[32];
-    LPCSTR	str = NULL;
+    WCHAR	buf[32];
+    LPCWSTR	str = NULL;
 
     /* first look up existing for existing devType */
     for (uTbl = 0; uTbl < MAX_MCICMDTABLE; uTbl++) {
@@ -319,15 +674,16 @@
 
     /* well try to load id */
     if (uDevType >= MCI_DEVTYPE_FIRST && uDevType <= MCI_DEVTYPE_LAST) {
-	if (LoadStringA(WINMM_IData->hWinMM32Instance, uDevType, buf, sizeof(buf))) {
+	if (LoadStringW(WINMM_IData->hWinMM32Instance, uDevType, buf, sizeof(buf) / sizeof(WCHAR))) {
 	    str = buf;
 	}
     } else if (uDevType == 0) {
-	str = "CORE";
+        static const WCHAR wszCore[] = {'C','O','R','E',0};
+	str = wszCore;
     }
     uTbl = MCI_NO_COMMAND_TABLE;
     if (str) {
-	HRSRC 	hRsrc = FindResourceA(WINMM_IData->hWinMM32Instance, str, (LPCSTR)RT_RCDATA);
+	HRSRC 	hRsrc = FindResourceW(WINMM_IData->hWinMM32Instance, str, (LPCWSTR)RT_RCDATA);
 	HANDLE	hMem = 0;
 
 	if (hRsrc) hMem = LoadResource(WINMM_IData->hWinMM32Instance, hRsrc);
@@ -335,7 +691,7 @@
 	    uTbl = MCI_SetCommandTable(LockResource(hMem), uDevType);
 	} else {
 	    WARN("No command table found in resource %p[%s]\n",
-		 WINMM_IData->hWinMM32Instance, str);
+		 WINMM_IData->hWinMM32Instance, debugstr_w(str));
 	}
     }
     TRACE("=> %d\n", uTbl);
@@ -359,10 +715,11 @@
 	bInitDone = TRUE;
 	MCI_GetCommandTable(0);
     }
-
+    TRACE("(%p, %u)\n", table, uDevType);
     for (uTbl = 0; uTbl < MAX_MCICMDTABLE; uTbl++) {
 	if (!S_MciCmdTable[uTbl].lpTable) {
-	    LPCSTR 	lmem, str;
+	    const BYTE* lmem;
+	    LPCWSTR 	str;
 	    WORD	eid;
 	    WORD	count;
 
@@ -378,21 +735,22 @@
 	    lmem = S_MciCmdTable[uTbl].lpTable;
 	    count = 0;
 	    do {
-		lmem += strlen(lmem) + 1;
+		str = (LPCWSTR)lmem;
+		lmem += (strlenW(str) + 1) * sizeof(WCHAR);
 		eid = *(const WORD*)(lmem + sizeof(DWORD));
 		lmem += sizeof(DWORD) + sizeof(WORD);
 		if (eid == MCI_COMMAND_HEAD)
 		    count++;
 	    } while (eid != MCI_END_COMMAND_LIST);
 
-	    S_MciCmdTable[uTbl].aVerbs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(LPCSTR));
+	    S_MciCmdTable[uTbl].aVerbs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(LPCWSTR));
 	    S_MciCmdTable[uTbl].nVerbs = count;
 
 	    lmem = S_MciCmdTable[uTbl].lpTable;
 	    count = 0;
 	    do {
-		str = lmem;
-		lmem += strlen(lmem) + 1;
+		str = (LPCWSTR)lmem;
+		lmem += (strlenW(str) + 1) * sizeof(WCHAR);
 		eid = *(const WORD*)(lmem + sizeof(DWORD));
 		lmem += sizeof(DWORD) + sizeof(WORD);
 		if (eid == MCI_COMMAND_HEAD)
@@ -409,11 +767,12 @@
 /**************************************************************************
  * 				MCI_DeleteCommandTable		[internal]
  */
-static	BOOL	MCI_DeleteCommandTable(UINT uTbl)
+BOOL	MCI_DeleteCommandTable(UINT uTbl, BOOL delete)
 {
     if (uTbl >= MAX_MCICMDTABLE || !S_MciCmdTable[uTbl].lpTable)
 	return FALSE;
 
+    if (delete) HeapFree(GetProcessHeap(), 0, (void*)S_MciCmdTable[uTbl].lpTable);
     S_MciCmdTable[uTbl].lpTable = NULL;
     HeapFree(GetProcessHeap(), 0, S_MciCmdTable[uTbl].aVerbs);
     S_MciCmdTable[uTbl].aVerbs = 0;
@@ -455,33 +814,33 @@
 /**************************************************************************
  * 				MCI_OpenMciDriver		[internal]
  */
-static	BOOL	MCI_OpenMciDriver(LPWINE_MCIDRIVER wmd, LPCSTR drvTyp, LPARAM lp)
+static	BOOL	MCI_OpenMciDriver(LPWINE_MCIDRIVER wmd, LPCWSTR drvTyp, LPARAM lp)
 {
-    char	libName[128];
+    WCHAR	libName[128];
 
-    if (!DRIVER_GetLibName(drvTyp, "mci", libName, sizeof(libName)))
+    if (!DRIVER_GetLibName(drvTyp, wszMci, libName, sizeof(libName)))
 	return FALSE;
 
     wmd->bIs32 = 0xFFFF;
     /* First load driver */
     if ((wmd->hDriver = (HDRVR)DRIVER_TryOpenDriver32(libName, lp))) {
 	wmd->bIs32 = TRUE;
-    } else if (WINMM_CheckForMMSystem() && pFnMciMapMsg32ATo16) {
+    } else if (WINMM_CheckForMMSystem() && pFnMciMapMsg32WTo16) {
 	WINMM_MapType 	res;
 
-	switch (res = pFnMciMapMsg32ATo16(0, DRV_OPEN, 0, &lp)) {
+	switch (res = pFnMciMapMsg32WTo16(0, DRV_OPEN, 0, &lp)) {
 	case WINMM_MAP_MSGERROR:
 	    TRACE("Not handled yet (DRV_OPEN)\n");
 	    break;
 	case WINMM_MAP_NOMEM:
-	    TRACE("Problem mapping msg=DRV_OPEN from 32a to 16\n");
+	    TRACE("Problem mapping msg=DRV_OPEN from 32W to 16\n");
 	    break;
 	case WINMM_MAP_OK:
 	case WINMM_MAP_OKMEM:
-	    if ((wmd->hDriver = OpenDriverA(drvTyp, "mci", lp)))
+	    if ((wmd->hDriver = OpenDriver(drvTyp, wszMci, lp)))
 		wmd->bIs32 = FALSE;
 	    if (res == WINMM_MAP_OKMEM)
-		pFnMciUnMapMsg32ATo16(0, DRV_OPEN, 0, lp);
+		pFnMciUnMapMsg32WTo16(0, DRV_OPEN, 0, lp);
 	    break;
 	}
     }
@@ -491,11 +850,11 @@
 /**************************************************************************
  * 				MCI_LoadMciDriver		[internal]
  */
-static	DWORD	MCI_LoadMciDriver(LPCSTR _strDevTyp, LPWINE_MCIDRIVER* lpwmd)
+static	DWORD	MCI_LoadMciDriver(LPCWSTR _strDevTyp, LPWINE_MCIDRIVER* lpwmd)
 {
-    LPSTR			strDevTyp = str_dup_upper(_strDevTyp);
+    LPWSTR			strDevTyp = str_dup_upper(_strDevTyp);
     LPWINE_MCIDRIVER		wmd = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*wmd));
-    MCI_OPEN_DRIVER_PARMSA	modp;
+    MCI_OPEN_DRIVER_PARMSW	modp;
     DWORD			dwRet = 0;
 
     if (!wmd || !strDevTyp) {
@@ -530,13 +889,13 @@
 	/* silence warning if all is used... some bogus program use commands like
 	 * 'open all'...
 	 */
-	if (strcasecmp(strDevTyp, "all") == 0) {
+	if (strcmpiW(strDevTyp, wszAll) == 0) {
 	    dwRet = MCIERR_CANNOT_USE_ALL;
 	} else {
 	    FIXME("Couldn't load driver for type %s.\n"
 		  "If you don't have a windows installation accessible from Wine,\n"
 		  "you perhaps forgot to create a [mci] section in system.ini\n",
-		  strDevTyp);
+		  debugstr_w(strDevTyp));
 	    dwRet = MCIERR_DEVICE_NOT_INSTALLED;
 	}
 	goto errCleanUp;
@@ -551,7 +910,7 @@
     wmd->uTypeCmdTable = MCI_COMMAND_TABLE_NOT_LOADED;
 
     TRACE("Loaded driver %p (%s), type is %d, cmdTable=%08x\n",
-	  wmd->hDriver, strDevTyp, modp.wType, modp.wCustomCommandTable);
+	  wmd->hDriver, debugstr_w(strDevTyp), modp.wType, modp.wCustomCommandTable);
 
     wmd->lpstrDeviceType = strDevTyp;
     wmd->wType = modp.wType;
@@ -570,18 +929,18 @@
 /**************************************************************************
  * 			MCI_FinishOpen				[internal]
  */
-static	DWORD	MCI_FinishOpen(LPWINE_MCIDRIVER wmd, LPMCI_OPEN_PARMSA lpParms,
+static	DWORD	MCI_FinishOpen(LPWINE_MCIDRIVER wmd, LPMCI_OPEN_PARMSW lpParms,
 			       DWORD dwParam)
 {
     if (dwParam & MCI_OPEN_ELEMENT)
     {
-        wmd->lpstrElementName = HeapAlloc(GetProcessHeap(),0,strlen(lpParms->lpstrElementName)+1);
-        strcpy( wmd->lpstrElementName, lpParms->lpstrElementName );
+        wmd->lpstrElementName = HeapAlloc(GetProcessHeap(),0,(strlenW(lpParms->lpstrElementName)+1) * sizeof(WCHAR));
+        strcpyW( wmd->lpstrElementName, lpParms->lpstrElementName );
     }
     if (dwParam & MCI_OPEN_ALIAS)
     {
-        wmd->lpstrAlias = HeapAlloc(GetProcessHeap(), 0, strlen(lpParms->lpstrAlias)+1);
-        strcpy( wmd->lpstrAlias, lpParms->lpstrAlias);
+        wmd->lpstrAlias = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpParms->lpstrAlias)+1) * sizeof(WCHAR));
+        strcpyW( wmd->lpstrAlias, lpParms->lpstrAlias);
     }
     lpParms->wDeviceID = wmd->wDeviceID;
 
@@ -592,7 +951,7 @@
 /**************************************************************************
  * 				MCI_FindCommand		[internal]
  */
-static	LPCSTR		MCI_FindCommand(UINT uTbl, LPCSTR verb)
+static	LPCWSTR		MCI_FindCommand(UINT uTbl, LPCWSTR verb)
 {
     UINT	idx;
 
@@ -604,7 +963,7 @@
      * array look up
      */
     for (idx = 0; idx < S_MciCmdTable[uTbl].nVerbs; idx++) {
-	if (strcasecmp(S_MciCmdTable[uTbl].aVerbs[idx], verb) == 0)
+	if (strcmpiW(S_MciCmdTable[uTbl].aVerbs[idx], verb) == 0)
 	    return S_MciCmdTable[uTbl].aVerbs[idx];
     }
 
@@ -614,9 +973,9 @@
 /**************************************************************************
  * 				MCI_GetReturnType		[internal]
  */
-static	DWORD		MCI_GetReturnType(LPCSTR lpCmd)
+static	DWORD		MCI_GetReturnType(LPCWSTR lpCmd)
 {
-    lpCmd += strlen(lpCmd) + 1 + sizeof(DWORD) + sizeof(WORD);
+    lpCmd += strlenW(lpCmd) + 1 + sizeof(DWORD) + sizeof(WORD);
     if (*lpCmd == '\0' && *(const WORD*)(lpCmd + 1 + sizeof(DWORD)) == MCI_RETURN) {
 	return *(const DWORD*)(lpCmd + 1);
     }
@@ -626,20 +985,20 @@
 /**************************************************************************
  * 				MCI_GetMessage			[internal]
  */
-static	WORD		MCI_GetMessage(LPCSTR lpCmd)
+static	WORD		MCI_GetMessage(LPCWSTR lpCmd)
 {
-    return (WORD)*(const DWORD*)(lpCmd + strlen(lpCmd) + 1);
+    return (WORD)*(const DWORD*)(lpCmd + strlenW(lpCmd) + 1);
 }
 
 /**************************************************************************
  * 				MCI_GetDWord			[internal]
  */
-static	BOOL		MCI_GetDWord(LPDWORD data, LPSTR* ptr)
+static	BOOL		MCI_GetDWord(LPDWORD data, LPWSTR* ptr)
 {
     DWORD	val;
-    LPSTR	ret;
+    LPWSTR	ret;
 
-    val = strtoul(*ptr, &ret, 0);
+    val = strtoulW(*ptr, &ret, 0);
 
     switch (*ret) {
     case '\0':	break;
@@ -655,13 +1014,13 @@
 /**************************************************************************
  * 				MCI_GetString		[internal]
  */
-static	DWORD	MCI_GetString(LPSTR* str, LPSTR* args)
+static	DWORD	MCI_GetString(LPWSTR* str, LPWSTR* args)
 {
-    LPSTR	ptr = *args;
+    LPWSTR      ptr = *args;
 
     /* see if we have a quoted string */
     if (*ptr == '"') {
-	ptr = strchr(*str = ptr + 1, '"');
+	ptr = strchrW(*str = ptr + 1, '"');
 	if (!ptr) return MCIERR_NO_CLOSING_QUOTE;
 	/* FIXME: shall we escape \" from string ?? */
 	if (ptr[-1] == '\\') TRACE("Ooops: un-escaped \"\n");
@@ -669,12 +1028,12 @@
 	if (*ptr != ' ' && *ptr != '\0') return MCIERR_EXTRA_CHARACTERS;
 	*ptr++ = '\0';
     } else {
-	ptr = strchr(ptr, ' ');
+	ptr = strchrW(ptr, ' ');
 
 	if (ptr) {
 	    *ptr++ = '\0';
 	} else {
-	    ptr = *args + strlen(*args);
+	    ptr = *args + strlenW(*args);
 	}
 	*str = *args;
     }
@@ -688,32 +1047,33 @@
 /**************************************************************************
  * 				MCI_ParseOptArgs		[internal]
  */
-static	DWORD	MCI_ParseOptArgs(LPDWORD data, int _offset, LPCSTR lpCmd,
-				 LPSTR args, LPDWORD dwFlags)
+static	DWORD	MCI_ParseOptArgs(LPDWORD data, int _offset, LPCWSTR lpCmd,
+				 LPWSTR args, LPDWORD dwFlags)
 {
     int		len, offset;
-    LPCSTR	lmem, str;
+    const char* lmem;
+    LPCWSTR     str;
     DWORD	dwRet, flg, cflg = 0;
     WORD	eid;
     BOOL	inCst, found;
 
     /* loop on arguments */
     while (*args) {
-	lmem = lpCmd;
+	lmem = (const char*)lpCmd;
 	found = inCst = FALSE;
 	offset = _offset;
 
 	/* skip any leading white space(s) */
 	while (*args == ' ') args++;
-	TRACE("args='%s' offset=%d\n", args, offset);
+	TRACE("args=%s offset=%d\n", debugstr_w(args), offset);
 
 	do { /* loop on options for command table for the requested verb */
-	    str = lmem;
-	    lmem += (len = strlen(lmem)) + 1;
+	    str = (LPCWSTR)lmem;
+	    lmem += ((len = strlenW(str)) + 1) * sizeof(WCHAR);
 	    flg = *(const DWORD*)lmem;
 	    eid = *(const WORD*)(lmem + sizeof(DWORD));
 	    lmem += sizeof(DWORD) + sizeof(WORD);
-/* EPP 	    TRACE("\tcmd='%s' inCst=%c eid=%04x\n", str, inCst ? 'Y' : 'N', eid); */
+            /* TRACE("\tcmd=%s inCst=%c eid=%04x\n", debugstr_w(str), inCst ? 'Y' : 'N', eid); */
 
 	    switch (eid) {
 	    case MCI_CONSTANT:
@@ -727,7 +1087,7 @@
 		break;
 	    }
 
-	    if (strncasecmp(args, str, len) == 0 &&
+	    if (strncmpiW(args, str, len) == 0 &&
 		(args[len] == 0 || args[len] == ' ')) {
 		/* store good values into data[] */
 		args += len;
@@ -764,13 +1124,13 @@
 			!MCI_GetDWord(&(data[offset+1]), &args) ||
 			!MCI_GetDWord(&(data[offset+2]), &args) ||
 			!MCI_GetDWord(&(data[offset+3]), &args)) {
-			ERR("Bad rect '%s'\n", args);
+			ERR("Bad rect %s\n", debugstr_w(args));
 			return MCIERR_BAD_INTEGER;
 		    }
 		    break;
 		case MCI_STRING:
 		    *dwFlags |= flg;
-		    if ((dwRet = MCI_GetString((LPSTR*)&data[offset], &args)))
+		    if ((dwRet = MCI_GetString((LPWSTR*)&data[offset], &args)))
 			return dwRet;
 		    break;
 		default:	ERR("oops\n");
@@ -795,7 +1155,7 @@
 	    }
 	} while (eid != MCI_END_COMMAND);
 	if (!found) {
-	    WARN("Optarg '%s' not found\n", args);
+	    WARN("Optarg %s not found\n", debugstr_w(args));
 	    return MCIERR_UNRECOGNIZED_COMMAND;
 	}
 	if (offset == MCI_DATA_SIZE) {
@@ -810,8 +1170,13 @@
  * 				MCI_HandleReturnValues	[internal]
  */
 static	DWORD	MCI_HandleReturnValues(DWORD dwRet, LPWINE_MCIDRIVER wmd, DWORD retType, 
-                                       LPDWORD data, LPSTR lpstrRet, UINT uRetLen)
+                                       LPDWORD data, LPWSTR lpstrRet, UINT uRetLen)
 {
+    static const WCHAR wszLd  [] = {'%','l','d',0};
+    static const WCHAR wszLd4 [] = {'%','l','d',' ','%','l','d',' ','%','l','d',' ','%','l','d',0};
+    static const WCHAR wszCol3[] = {'%','d',':','%','d',':','%','d',0};
+    static const WCHAR wszCol4[] = {'%','d',':','%','d',':','%','d',':','%','d',0};
+
     if (lpstrRet) {
 	switch (retType) {
 	case 0: /* nothing to return */
@@ -820,30 +1185,30 @@
 	    switch (dwRet & 0xFFFF0000ul) {
 	    case 0:
 	    case MCI_INTEGER_RETURNED:
-		snprintf(lpstrRet, uRetLen, "%ld", data[1]);
+		snprintfW(lpstrRet, uRetLen, wszLd, data[1]);
 		break;
 	    case MCI_RESOURCE_RETURNED:
 		/* return string which ID is HIWORD(data[1]),
 		 * string is loaded from mmsystem.dll */
-		LoadStringA(WINMM_IData->hWinMM32Instance, HIWORD(data[1]),
+		LoadStringW(WINMM_IData->hWinMM32Instance, HIWORD(data[1]),
 			    lpstrRet, uRetLen);
 		break;
 	    case MCI_RESOURCE_RETURNED|MCI_RESOURCE_DRIVER:
 		/* return string which ID is HIWORD(data[1]),
 		 * string is loaded from driver */
 		/* FIXME: this is wrong for a 16 bit handle */
-		LoadStringA(GetDriverModuleHandle(wmd->hDriver),
+		LoadStringW(GetDriverModuleHandle(wmd->hDriver),
 			    HIWORD(data[1]), lpstrRet, uRetLen);
 		break;
 	    case MCI_COLONIZED3_RETURN:
-		snprintf(lpstrRet, uRetLen, "%d:%d:%d",
-			 LOBYTE(LOWORD(data[1])), HIBYTE(LOWORD(data[1])),
-			 LOBYTE(HIWORD(data[1])));
+		snprintfW(lpstrRet, uRetLen, wszCol3,
+			  LOBYTE(LOWORD(data[1])), HIBYTE(LOWORD(data[1])),
+			  LOBYTE(HIWORD(data[1])));
 		break;
 	    case MCI_COLONIZED4_RETURN:
-		snprintf(lpstrRet, uRetLen, "%d:%d:%d:%d",
-			 LOBYTE(LOWORD(data[1])), HIBYTE(LOWORD(data[1])),
-			 LOBYTE(HIWORD(data[1])), HIBYTE(HIWORD(data[1])));
+		snprintfW(lpstrRet, uRetLen, wszCol4,
+			  LOBYTE(LOWORD(data[1])), HIBYTE(LOWORD(data[1])),
+			  LOBYTE(HIWORD(data[1])), HIBYTE(HIWORD(data[1])));
 		break;
 	    default:	ERR("Ooops (%04X)\n", HIWORD(dwRet));
 	    }
@@ -855,7 +1220,7 @@
 		break;
 	    case MCI_INTEGER_RETURNED:
 		data[1] = *(LPDWORD)lpstrRet;
-		snprintf(lpstrRet, uRetLen, "%ld", data[1]);
+		snprintfW(lpstrRet, uRetLen, wszLd, data[1]);
 		break;
 	    default:
 		WARN("Oooch. MCI_STRING and HIWORD(dwRet)=%04x\n", HIWORD(dwRet));
@@ -865,8 +1230,8 @@
 	case MCI_RECT:
 	    if (dwRet & 0xFFFF0000ul)
 		WARN("Oooch. MCI_STRING and HIWORD(dwRet)=%04x\n", HIWORD(dwRet));
-	    snprintf(lpstrRet, uRetLen, "%ld %ld %ld %ld",
-		       data[1], data[2], data[3], data[4]);
+	    snprintfW(lpstrRet, uRetLen, wszLd4,
+                      data[1], data[2], data[3], data[4]);
 	    break;
 	default:		ERR("oops\n");
 	}
@@ -875,32 +1240,35 @@
 }
 
 /**************************************************************************
- * 				mciSendStringA		[WINMM.@]
+ * 				mciSendStringW		[WINMM.@]
  */
-DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet,
+DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet,
 			    UINT uRetLen, HWND hwndCallback)
 {
-    LPSTR		verb, dev, args;
+    LPWSTR		verb, dev, args;
     LPWINE_MCIDRIVER	wmd = 0;
     DWORD		dwFlags = 0, dwRet = 0;
     int			offset = 0;
     DWORD		data[MCI_DATA_SIZE];
     DWORD		retType;
-    LPCSTR		lpCmd = 0;
-    LPSTR		devAlias = NULL;
+    LPCWSTR		lpCmd = 0;
+    LPWSTR		devAlias = NULL;
     BOOL		bAutoOpen = FALSE;
+    static const WCHAR  wszNew[] = {'n','e','w',0};
+    static const WCHAR  wszSAliasS[] = {' ','a','l','i','a','s',' ',0};
 
-    TRACE("('%s', %p, %d, %p)\n", lpstrCommand, lpstrRet, uRetLen, hwndCallback);
+    TRACE("(%s, %p, %d, %p)\n", 
+          debugstr_w(lpstrCommand), lpstrRet, uRetLen, hwndCallback);
 
     /* format is <command> <device> <optargs> */
-    if (!(verb = HeapAlloc(GetProcessHeap(), 0, strlen(lpstrCommand)+1)))
+    if (!(verb = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpstrCommand)+1) * sizeof(WCHAR))))
 	return MCIERR_OUT_OF_MEMORY;
-    strcpy( verb, lpstrCommand );
-    CharLowerA(verb);
+    strcpyW( verb, lpstrCommand );
+    CharLowerW(verb);
 
     memset(data, 0, sizeof(data));
 
-    if (!(args = strchr(verb, ' '))) {
+    if (!(args = strchrW(verb, ' '))) {
 	dwRet = MCIERR_MISSING_DEVICE_NAME;
 	goto errCleanUp;
     }
@@ -910,17 +1278,17 @@
     }
 
     /* case dev == 'new' has to be handled */
-    if (!strcmp(dev, "new")) {
+    if (!strcmpW(dev, wszNew)) {
 	FIXME("'new': NIY as device name\n");
 	dwRet = MCIERR_MISSING_DEVICE_NAME;
 	goto errCleanUp;
     }
 
     /* otherwise, try to grab devType from open */
-    if (!strcmp(verb, "open")) {
-	LPSTR	devType, tmp;
+    if (!strcmpW(verb, wszOpen)) {
+	LPWSTR	devType, tmp;
 
-	if ((devType = strchr(dev, '!')) != NULL) {
+	if ((devType = strchrW(dev, '!')) != NULL) {
 	    *devType++ = '\0';
 	    tmp = devType; devType = dev; dev = tmp;
 
@@ -929,23 +1297,24 @@
 	    devType = str_dup_upper(devType);
 	    dwFlags |= MCI_OPEN_ELEMENT;
 	    data[3] = (DWORD)dev;
-	} else if (strchr(dev, '.') == NULL) {
-	    tmp = strchr(dev,' ');
+	} else if (strchrW(dev, '.') == NULL) {
+	    tmp = strchrW(dev,' ');
 	    if (tmp) *tmp = '\0';
 	    data[2] = (DWORD)dev;
 	    devType = str_dup_upper(dev);
 	    if (tmp) *tmp = ' ';
 	    dwFlags |= MCI_OPEN_TYPE;
 	} else {
-	    if ((devType = strstr(args, "type ")) != NULL) {
+            static const WCHAR wszTypeS[] = {'t','y','p','e',' ',0};
+	    if ((devType = strstrW(args, wszTypeS)) != NULL) {
 		devType += 5;
-		tmp = strchr(devType, ' ');
+		tmp = strchrW(devType, ' ');
 		if (tmp) *tmp = '\0';
 		devType = str_dup_upper(devType);
 		if (tmp) *tmp = ' ';
 		/* dwFlags and data[2] will be correctly set in ParseOpt loop */
 	    } else {
-		char	buf[32];
+		WCHAR	buf[32];
 		if ((dwRet = MCI_GetDevTypeFromFileName(dev, buf, sizeof(buf))))
 		    goto errCleanUp;
 
@@ -954,13 +1323,13 @@
 	    dwFlags |= MCI_OPEN_ELEMENT;
 	    data[3] = (DWORD)dev;
 	}
-	if ((devAlias = strstr(args," alias "))) {
-            char *tmp2;
+	if ((devAlias = strstrW(args, wszSAliasS))) {
+            WCHAR*      tmp2;
 	    devAlias += 7;
-	    if (!(tmp = strchr(devAlias,' '))) tmp = devAlias + strlen(devAlias);
+	    if (!(tmp = strchrW(devAlias,' '))) tmp = devAlias + strlenW(devAlias);
 	    if (tmp) *tmp = '\0';
-            tmp2 = HeapAlloc(GetProcessHeap(), 0, tmp - devAlias + 1 );
-            memcpy( tmp2, devAlias, tmp - devAlias );
+            tmp2 = HeapAlloc(GetProcessHeap(), 0, (tmp - devAlias + 1) * sizeof(WCHAR) );
+            memcpy( tmp2, devAlias, (tmp - devAlias) * sizeof(WCHAR) );
             tmp2[tmp - devAlias] = 0;
             data[4] = (DWORD)tmp2;
 	    /* should be done in regular options parsing */
@@ -975,15 +1344,16 @@
 	    MCI_UnLoadMciDriver(wmd);
 	    goto errCleanUp;
 	}
-    } else if (!(wmd = MCI_GetDriver(mciGetDeviceIDA(dev)))) {
+    } else if (!(wmd = MCI_GetDriver(mciGetDeviceIDW(dev)))) {
 	/* auto open */
-	char	buf[128];
-	sprintf(buf, "open %s wait", dev);
+        static WCHAR wszOpenWait[] = {'o','p','e','n',' ','%','s',' ','w','a','i','t',0};
+	WCHAR   buf[128];
+	sprintfW(buf, wszOpenWait, dev);
 
-	if ((dwRet = mciSendStringA(buf, NULL, 0, 0)) != 0)
+	if ((dwRet = mciSendStringW(buf, NULL, 0, 0)) != 0)
 	    goto errCleanUp;
 
-	wmd = MCI_GetDriver(mciGetDeviceIDA(dev));
+	wmd = MCI_GetDriver(mciGetDeviceIDW(dev));
 	if (!wmd) {
 	    /* FIXME: memory leak, MCI driver is not closed */
 	    dwRet = MCIERR_INVALID_DEVICE_ID;
@@ -1007,7 +1377,7 @@
     if (!lpCmd) lpCmd = MCI_FindCommand(MCI_GetCommandTable(0), verb);
 
     if (!lpCmd) {
-	TRACE("Command '%s' not found!\n", verb);
+	TRACE("Command %s not found!\n", debugstr_w(verb));
 	dwRet = MCIERR_UNRECOGNIZED_COMMAND;
 	goto errCleanUp;
     }
@@ -1027,7 +1397,8 @@
     default:	ERR("oops\n");
     }
 
-    TRACE("verb='%s' on dev='%s'; offset=%d\n", verb, dev, offset);
+    TRACE("verb=%s on dev=%s; offset=%d\n", 
+          debugstr_w(verb), debugstr_w(dev), offset);
 
     if ((dwRet = MCI_ParseOptArgs(data, offset, lpCmd, args, &dwFlags)))
 	goto errCleanUp;
@@ -1043,20 +1414,20 @@
 
     TRACE("[%d, %s, %08lx, %08lx/%s %08lx/%s %08lx/%s %08lx/%s %08lx/%s %08lx/%s]\n",
 	  wmd->wDeviceID, MCI_MessageToString(MCI_GetMessage(lpCmd)), dwFlags,
-	  data[0], debugstr_a((char *)data[0]), data[1], debugstr_a((char *)data[1]),
-	  data[2], debugstr_a((char *)data[2]), data[3], debugstr_a((char *)data[3]),
-	  data[4], debugstr_a((char *)data[4]), data[5], debugstr_a((char *)data[5]));
+	  data[0], debugstr_w((WCHAR *)data[0]), data[1], debugstr_w((WCHAR *)data[1]),
+	  data[2], debugstr_w((WCHAR *)data[2]), data[3], debugstr_w((WCHAR *)data[3]),
+	  data[4], debugstr_w((WCHAR *)data[4]), data[5], debugstr_w((WCHAR *)data[5]));
 
-    if (strcmp(verb, "open") == 0) {
-	if ((dwRet = MCI_FinishOpen(wmd, (LPMCI_OPEN_PARMSA)data, dwFlags)))
+    if (strcmpW(verb, wszOpen) == 0) {
+	if ((dwRet = MCI_FinishOpen(wmd, (LPMCI_OPEN_PARMSW)data, dwFlags)))
 	    MCI_UnLoadMciDriver(wmd);
 	/* FIXME: notification is not properly shared across two opens */
     } else {
 	dwRet = MCI_SendCommand(wmd->wDeviceID, MCI_GetMessage(lpCmd), dwFlags, (DWORD)data, TRUE);
     }
-    TRACE("=> 1/ %lx (%s)\n", dwRet, lpstrRet);
+    TRACE("=> 1/ %lx (%s)\n", dwRet, debugstr_w(lpstrRet));
     dwRet = MCI_HandleReturnValues(dwRet, wmd, retType, data, lpstrRet, uRetLen);
-    TRACE("=> 2/ %lx (%s)\n", dwRet, lpstrRet);
+    TRACE("=> 2/ %lx (%s)\n", dwRet, debugstr_w(lpstrRet));
 
 errCleanUp:
     HeapFree(GetProcessHeap(), 0, verb);
@@ -1065,30 +1436,30 @@
 }
 
 /**************************************************************************
- * 				mciSendStringW			[WINMM.@]
+ * 				mciSendStringA			[WINMM.@]
  */
-DWORD WINAPI mciSendStringW(LPCWSTR lpwstrCommand, LPWSTR lpwstrRet,
+DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrRet,
 			    UINT uRetLen, HWND hwndCallback)
 {
-    LPSTR 	lpstrCommand;
-    LPSTR       lpstrRet = NULL;
+    LPWSTR 	lpwstrCommand;
+    LPWSTR      lpwstrRet = NULL;
     UINT	ret;
     INT len;
 
     /* FIXME: is there something to do with lpstrReturnString ? */
-    len = WideCharToMultiByte( CP_ACP, 0, lpwstrCommand, -1, NULL, 0, NULL, NULL );
-    lpstrCommand = HeapAlloc( GetProcessHeap(), 0, len );
-    WideCharToMultiByte( CP_ACP, 0, lpwstrCommand, -1, lpstrCommand, len, NULL, NULL );
-    if (lpwstrRet)
+    len = MultiByteToWideChar( CP_ACP, 0, lpstrCommand, -1, NULL, 0 );
+    lpwstrCommand = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+    MultiByteToWideChar( CP_ACP, 0, lpstrCommand, -1, lpwstrCommand, len );
+    if (lpstrRet)
     {
-        lpstrRet = HeapAlloc(GetProcessHeap(), 0, uRetLen * sizeof(WCHAR));
-        if (!lpstrRet) return MMSYSERR_NOMEM;
+        lpwstrRet = HeapAlloc(GetProcessHeap(), 0, uRetLen * sizeof(WCHAR));
+        if (!lpwstrRet) return MCIERR_OUT_OF_MEMORY;
     }
-    ret = mciSendStringA(lpstrCommand, lpstrRet, uRetLen, hwndCallback);
+    ret = mciSendStringW(lpwstrCommand, lpwstrRet, uRetLen, hwndCallback);
     if (lpwstrRet)
-        MultiByteToWideChar( CP_ACP, 0, lpstrRet, -1, lpwstrRet, uRetLen );
-    HeapFree(GetProcessHeap(), 0, lpstrCommand);
-    HeapFree(GetProcessHeap(), 0, lpstrRet);
+        WideCharToMultiByte( CP_ACP, 0, lpwstrRet, -1, lpstrRet, uRetLen, NULL, NULL );
+    HeapFree(GetProcessHeap(), 0, lpwstrCommand);
+    HeapFree(GetProcessHeap(), 0, lpwstrRet);
     return ret;
 }
 
@@ -1096,7 +1467,7 @@
  * 				mciExecute			[WINMM.@]
  * 				mciExecute			[MMSYSTEM.712]
  */
-DWORD WINAPI mciExecute(LPCSTR lpstrCommand)
+BOOL WINAPI mciExecute(LPCSTR lpstrCommand)
 {
     char	strRet[256];
     DWORD	ret;
@@ -1111,7 +1482,7 @@
 	MessageBoxA(0, strRet, "Error in mciExecute()", MB_OK);
     }
     /* FIXME: what shall I return ? */
-    return 0;
+    return TRUE;
 }
 
 /**************************************************************************
@@ -1134,7 +1505,7 @@
     if (!type) {
 #if 0
         /* FIXME: we should put this back into order, but I never found a program
-         * actually using this feature, so we not need it
+         * actually using this feature, so we may not need it
          */
 	char		buf[128];
 	OFSTRUCT       	ofs;
@@ -1163,7 +1534,7 @@
 {
     TRACE("(%08x)!\n", uTable);
 
-    return MCI_DeleteCommandTable(uTable);
+    return MCI_DeleteCommandTable(uTable, FALSE);
 }
 
 /**************************************************************************
@@ -1177,10 +1548,10 @@
     if (wmd) {
 	if (wmd->bIs32) {
 	    dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2);
-	} else if (pFnMciMapMsg32ATo16) {
+	} else if (pFnMciMapMsg32WTo16) {
 	    WINMM_MapType	res;
 
-	    switch (res = pFnMciMapMsg32ATo16(wmd->wType, wMsg, dwParam1, &dwParam2)) {
+	    switch (res = pFnMciMapMsg32WTo16(wmd->wType, wMsg, dwParam1, &dwParam2)) {
 	    case WINMM_MAP_MSGERROR:
 		TRACE("Not handled yet (%s)\n", MCI_MessageToString(wMsg));
 		dwRet = MCIERR_DRIVER_INTERNAL;
@@ -1193,7 +1564,7 @@
 	    case WINMM_MAP_OKMEM:
 		dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2);
 		if (res == WINMM_MAP_OKMEM)
-		    pFnMciUnMapMsg32ATo16(wmd->wType, wMsg, dwParam1, dwParam2);
+		    pFnMciUnMapMsg32WTo16(wmd->wType, wMsg, dwParam1, dwParam2);
 		break;
 	    }
 	}
@@ -1212,10 +1583,10 @@
     if (wmd) {
 	dwRet = MCIERR_INVALID_DEVICE_ID;
 
-	if (wmd->bIs32 && pFnMciMapMsg16To32A) {
+	if (wmd->bIs32 && pFnMciMapMsg16To32W) {
 	    WINMM_MapType		res;
 
-	    switch (res = pFnMciMapMsg16To32A(wmd->wType, wMsg, &dwParam2)) {
+	    switch (res = pFnMciMapMsg16To32W(wmd->wType, wMsg, &dwParam2)) {
 	    case WINMM_MAP_MSGERROR:
 		TRACE("Not handled yet (%s)\n", MCI_MessageToString(wMsg));
 		dwRet = MCIERR_DRIVER_INTERNAL;
@@ -1228,7 +1599,7 @@
 	    case WINMM_MAP_OKMEM:
 		dwRet = SendDriverMessage(wmd->hDriver, wMsg, dwParam1, dwParam2);
 		if (res == WINMM_MAP_OKMEM)
-		    pFnMciUnMapMsg16To32A(wmd->wType, wMsg, dwParam2);
+		    pFnMciUnMapMsg16To32W(wmd->wType, wMsg, dwParam2);
 		break;
 	    }
 	} else {
@@ -1241,9 +1612,9 @@
 /**************************************************************************
  * 			MCI_Open				[internal]
  */
-static	DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms)
+static	DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSW lpParms)
 {
-    char			strDevTyp[128];
+    WCHAR			strDevTyp[128];
     DWORD 			dwRet;
     LPWINE_MCIDRIVER		wmd = NULL;
 
@@ -1267,18 +1638,19 @@
 
 	    if (uDevType < MCI_DEVTYPE_FIRST ||
 		uDevType > MCI_DEVTYPE_LAST ||
-		!LoadStringA(WINMM_IData->hWinMM32Instance, uDevType, strDevTyp, sizeof(strDevTyp))) {
+		!LoadStringW(WINMM_IData->hWinMM32Instance, uDevType, 
+                             strDevTyp, sizeof(strDevTyp) / sizeof(WCHAR))) {
 		dwRet = MCIERR_BAD_INTEGER;
 		goto errCleanUp;
 	    }
 	} else {
-	    LPSTR	ptr;
+	    LPWSTR	ptr;
 	    if (lpParms->lpstrDeviceType == NULL) {
 		dwRet = MCIERR_NULL_PARAMETER_BLOCK;
 		goto errCleanUp;
 	    }
-	    strcpy(strDevTyp, lpParms->lpstrDeviceType);
-	    ptr = strchr(strDevTyp, '!');
+	    strcpyW(strDevTyp, lpParms->lpstrDeviceType);
+	    ptr = strchrW(strDevTyp, '!');
 	    if (ptr) {
 		/* this behavior is not documented in windows. However, since, in
 		 * some occasions, MCI_OPEN handling is translated by WinMM into
@@ -1286,7 +1658,8 @@
 		 */
 		if (dwParam & MCI_OPEN_ELEMENT) {
 		    ERR("Both MCI_OPEN_ELEMENT(%s) and %s are used\n",
-			lpParms->lpstrElementName, strDevTyp);
+			debugstr_w(lpParms->lpstrElementName), 
+                        debugstr_w(strDevTyp));
 		    dwRet = MCIERR_UNRECOGNIZED_KEYWORD;
 		    goto errCleanUp;
 		}
@@ -1297,11 +1670,11 @@
 	    }
 
 	}
-	TRACE("devType='%s' !\n", strDevTyp);
+	TRACE("devType=%s !\n", debugstr_w(strDevTyp));
     }
 
     if (dwParam & MCI_OPEN_ELEMENT) {
-	TRACE("lpstrElementName='%s'\n", lpParms->lpstrElementName);
+	TRACE("lpstrElementName=%s\n", debugstr_w(lpParms->lpstrElementName));
 
 	if (dwParam & MCI_OPEN_ELEMENT_ID) {
 	    FIXME("Unsupported yet flag MCI_OPEN_ELEMENT_ID\n");
@@ -1318,12 +1691,13 @@
 	if (!strDevTyp[0] &&
 	    MCI_GetDevTypeFromFileName(lpParms->lpstrElementName,
 				       strDevTyp, sizeof(strDevTyp))) {
-	    if (GetDriveTypeA(lpParms->lpstrElementName) != DRIVE_CDROM) {
+            static const WCHAR wszCdAudio[] = {'C','D','A','U','D','I','O',0};
+	    if (GetDriveTypeW(lpParms->lpstrElementName) != DRIVE_CDROM) {
 		dwRet = MCIERR_EXTENSION_NOT_FOUND;
 		goto errCleanUp;
 	    }
 	    /* FIXME: this will not work if several CDROM drives are installed on the machine */
-	    strcpy(strDevTyp, "CDAUDIO");
+	    strcpyW(strDevTyp, wszCdAudio);
 	}
     }
 
@@ -1334,7 +1708,7 @@
     }
 
     if (dwParam & MCI_OPEN_ALIAS) {
-	TRACE("Alias='%s' !\n", lpParms->lpstrAlias);
+	TRACE("Alias=%s !\n", debugstr_w(lpParms->lpstrAlias));
 	if (!lpParms->lpstrAlias) {
 	    dwRet = MCIERR_NULL_PARAMETER_BLOCK;
 	    goto errCleanUp;
@@ -1411,16 +1785,17 @@
 /**************************************************************************
  * 			MCI_WriteString				[internal]
  */
-DWORD	MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr)
+DWORD	MCI_WriteString(LPWSTR lpDstStr, DWORD dstSize, LPCWSTR lpSrcStr)
 {
     DWORD	ret = 0;
 
     if (lpSrcStr) {
-	if (dstSize <= strlen(lpSrcStr)) {
-	    lstrcpynA(lpDstStr, lpSrcStr, dstSize - 1);
+        dstSize /= sizeof(WCHAR);
+	if (dstSize <= strlenW(lpSrcStr)) {
+	    lstrcpynW(lpDstStr, lpSrcStr, dstSize - 1);
 	    ret = MCIERR_PARAM_OVERFLOW;
 	} else {
-	    strcpy(lpDstStr, lpSrcStr);
+	    strcpyW(lpDstStr, lpSrcStr);
 	}
     } else {
 	*lpDstStr = 0;
@@ -1431,10 +1806,10 @@
 /**************************************************************************
  * 			MCI_Sysinfo				[internal]
  */
-static	DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSA lpParms)
+static	DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSW lpParms)
 {
     DWORD		ret = MCIERR_INVALID_DEVICE_ID, cnt = 0;
-    CHAR		buf[2048], *s = buf, *p;
+    WCHAR		buf[2048], *s = buf, *p;
     LPWINE_MCIDRIVER	wmd;
     HKEY		hKey;
 
@@ -1455,13 +1830,13 @@
 		LeaveCriticalSection(&WINMM_IData->cs);
 	    } else {
 		TRACE("MCI_SYSINFO_QUANTITY: # of installed MCI drivers\n");
-		if (RegOpenKeyExA( HKEY_LOCAL_MACHINE, HKLM_MCI,
+		if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, wszHklmMci,
 			  	   0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS) {
-		    RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0);
+		    RegQueryInfoKeyW( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0);
 		    RegCloseKey( hKey );
 		}
-		if (GetPrivateProfileStringA("mci", 0, "", buf, sizeof(buf), "system.ini"))
-		    for(s = buf; *s; s += strlen(s) + 1) cnt++;
+		if (GetPrivateProfileStringW(wszMci, 0, wszNull, buf, sizeof(buf), wszSystemIni))
+		    for (s = buf; *s; s += strlenW(s) + 1) cnt++;
 	    }
 	} else {
 	    if (dwFlags & MCI_SYSINFO_OPEN) {
@@ -1490,7 +1865,7 @@
 	    *lpParms->lpstrReturn = 0;
 	    ret = MCIERR_INVALID_DEVICE_ID;
 	}
-	TRACE("(%ld) => '%s'\n", lpParms->dwNumber, lpParms->lpstrReturn);
+	TRACE("(%ld) => %s\n", lpParms->dwNumber, debugstr_w(lpParms->lpstrReturn));
 	break;
     case MCI_SYSINFO_NAME:
 	TRACE("MCI_SYSINFO_NAME\n");
@@ -1498,22 +1873,23 @@
 	    FIXME("Don't handle MCI_SYSINFO_NAME|MCI_SYSINFO_OPEN (yet)\n");
 	    ret = MCIERR_UNRECOGNIZED_COMMAND;
 	} else {
-	    DWORD lRet;
-	    s = 0;
-	    lRet = RegOpenKeyExA( HKEY_LOCAL_MACHINE, HKLM_MCI, 0, KEY_QUERY_VALUE, &hKey );
-	    if (lRet == ERROR_SUCCESS) {
-		lRet = RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0);
-		if (lRet == ERROR_SUCCESS && lpParms->dwNumber <= cnt) {
+	    s = NULL;
+	    if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, wszHklmMci, 0, 
+                               KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS) {
+		if (RegQueryInfoKeyW( hKey, 0, 0, 0, &cnt, 
+                                      0, 0, 0, 0, 0, 0, 0) == ERROR_SUCCESS && 
+                    lpParms->dwNumber <= cnt) {
     		    DWORD bufLen = sizeof(buf);
-		    lRet = RegEnumKeyExA(hKey, lpParms->dwNumber - 1, buf, &bufLen, 0, 0, 0, 0);
-		    if (lRet == ERROR_SUCCESS) s = buf;
+		    if (RegEnumKeyExW(hKey, lpParms->dwNumber - 1, 
+                                      buf, &bufLen, 0, 0, 0, 0) == ERROR_SUCCESS)
+                        s = buf;
 		}
 	        RegCloseKey( hKey );
 	    }
 	    if (!s) {
-		if (GetPrivateProfileStringA("mci", 0, "", buf, sizeof(buf), "system.ini")) {
-		    for(p = buf; *p; p += strlen(p) + 1, cnt++) {
-                        TRACE("%ld: %s\n", cnt, p);
+		if (GetPrivateProfileStringW(wszMci, 0, wszNull, buf, sizeof(buf), wszSystemIni)) {
+		    for (p = buf; *p; p += strlenW(p) + 1, cnt++) {
+                        TRACE("%ld: %s\n", cnt, debugstr_w(p));
 			if (cnt == lpParms->dwNumber - 1) {
 			    s = p;
 			    break;
@@ -1521,9 +1897,9 @@
 		    }
 		}
 	    }
-	    ret = s ? MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, s) : MCIERR_OUTOFRANGE;
+	    ret = s ? MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize / sizeof(WCHAR), s) : MCIERR_OUTOFRANGE;
 	}
-	TRACE("(%ld) => '%s'\n", lpParms->dwNumber, lpParms->lpstrReturn);
+	TRACE("(%ld) => %s\n", lpParms->dwNumber, debugstr_w(lpParms->lpstrReturn));
 	break;
     default:
 	TRACE("Unsupported flag value=%08lx\n", dwFlags);
@@ -1551,14 +1927,14 @@
 /**************************************************************************
  * 			MCI_Sound				[internal]
  */
-static	DWORD MCI_Sound(UINT wDevID, DWORD dwFlags, LPMCI_SOUND_PARMS lpParms)
+static	DWORD MCI_Sound(UINT wDevID, DWORD dwFlags, LPMCI_SOUND_PARMSW lpParms)
 {
     DWORD	dwRet = 0;
 
     if (lpParms == NULL)	return MCIERR_NULL_PARAMETER_BLOCK;
 
     if (dwFlags & MCI_SOUND_NAME)
-        dwRet = sndPlaySoundA(lpParms->lpstrSoundName, SND_SYNC) ? MMSYSERR_NOERROR : MMSYSERR_ERROR;
+        dwRet = sndPlaySoundW(lpParms->lpstrSoundName, SND_SYNC) ? MMSYSERR_NOERROR : MMSYSERR_ERROR;
     else
         dwRet = MMSYSERR_ERROR; /* what should be done ??? */
     if (dwFlags & MCI_NOTIFY)
@@ -1579,13 +1955,13 @@
     switch (wMsg) {
     case MCI_OPEN:
 	if (bFrom32) {
-	    dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
-	} else if (pFnMciMapMsg16To32A) {
-	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
+	    dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSW)dwParam2);
+	} else if (pFnMciMapMsg16To32W) {
+	    switch (pFnMciMapMsg16To32W(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
-		dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
-		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
+		dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSW)dwParam2);
+		pFnMciUnMapMsg16To32W(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1594,12 +1970,12 @@
     case MCI_CLOSE:
 	if (bFrom32) {
 	    dwRet = MCI_Close(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
-	} else if (pFnMciMapMsg16To32A) {
-	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
+	} else if (pFnMciMapMsg16To32W) {
+	    switch (pFnMciMapMsg16To32W(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
 		dwRet = MCI_Close(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
-		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
+		pFnMciUnMapMsg16To32W(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1607,13 +1983,13 @@
 	break;
     case MCI_SYSINFO:
 	if (bFrom32) {
-	    dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2);
-	} else if (pFnMciMapMsg16To32A) {
-	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
+	    dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSW)dwParam2);
+	} else if (pFnMciMapMsg16To32W) {
+	    switch (pFnMciMapMsg16To32W(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
-		dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2);
-		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
+		dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSW)dwParam2);
+		pFnMciUnMapMsg16To32W(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1622,12 +1998,12 @@
     case MCI_BREAK:
 	if (bFrom32) {
 	    dwRet = MCI_Break(wDevID, dwParam1, (LPMCI_BREAK_PARMS)dwParam2);
-	} else if (pFnMciMapMsg16To32A) {
-	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
+	} else if (pFnMciMapMsg16To32W) {
+	    switch (pFnMciMapMsg16To32W(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
 		dwRet = MCI_Break(wDevID, dwParam1, (LPMCI_BREAK_PARMS)dwParam2);
-		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
+		pFnMciUnMapMsg16To32W(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1635,13 +2011,13 @@
 	break;
     case MCI_SOUND:
 	if (bFrom32) {
-	    dwRet = MCI_Sound(wDevID, dwParam1, (LPMCI_SOUND_PARMS)dwParam2);
-	} else if (pFnMciMapMsg16To32A) {
-	    switch (pFnMciMapMsg16To32A(0, wMsg, &dwParam2)) {
+	    dwRet = MCI_Sound(wDevID, dwParam1, (LPMCI_SOUND_PARMSW)dwParam2);
+	} else if (pFnMciMapMsg16To32W) {
+	    switch (pFnMciMapMsg16To32W(0, wMsg, &dwParam2)) {
 	    case WINMM_MAP_OK:
 	    case WINMM_MAP_OKMEM:
-		dwRet = MCI_Sound(wDevID, dwParam1, (LPMCI_SOUND_PARMS)dwParam2);
-		pFnMciUnMapMsg16To32A(0, wMsg, dwParam2);
+		dwRet = MCI_Sound(wDevID, dwParam1, (LPMCI_SOUND_PARMSW)dwParam2);
+		pFnMciUnMapMsg16To32W(0, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1739,3 +2115,296 @@
     }
     return LOWORD(dwRet);
 }
+
+/**************************************************************************
+ * 				mciGetErrorStringW		[WINMM.@]
+ */
+BOOL WINAPI mciGetErrorStringW(MCIERROR wError, LPWSTR lpstrBuffer, UINT uLength)
+{
+    BOOL		ret = FALSE;
+
+    if (lpstrBuffer != NULL && uLength > 0 &&
+	wError >= MCIERR_BASE && wError <= MCIERR_CUSTOM_DRIVER_BASE) {
+
+	if (LoadStringW(WINMM_IData->hWinMM32Instance,
+			wError, lpstrBuffer, uLength) > 0) {
+	    ret = TRUE;
+	}
+    }
+    return ret;
+}
+
+/**************************************************************************
+ * 				mciGetErrorStringA		[WINMM.@]
+ */
+BOOL WINAPI mciGetErrorStringA(MCIERROR dwError, LPSTR lpstrBuffer, UINT uLength)
+{
+    BOOL		ret = FALSE;
+
+    if (lpstrBuffer != NULL && uLength > 0 &&
+	dwError >= MCIERR_BASE && dwError <= MCIERR_CUSTOM_DRIVER_BASE) {
+
+	if (LoadStringA(WINMM_IData->hWinMM32Instance,
+			dwError, lpstrBuffer, uLength) > 0) {
+	    ret = TRUE;
+	}
+    }
+    return ret;
+}
+
+/**************************************************************************
+ *			mciDriverNotify				[WINMM.@]
+ */
+BOOL WINAPI mciDriverNotify(HWND hWndCallBack, MCIDEVICEID wDevID, UINT wStatus)
+{
+    TRACE("(%p, %04x, %04X)\n", hWndCallBack, wDevID, wStatus);
+
+    return PostMessageW(hWndCallBack, MM_MCINOTIFY, wStatus, wDevID);
+}
+
+/**************************************************************************
+ * 			mciGetDriverData			[WINMM.@]
+ */
+DWORD WINAPI mciGetDriverData(MCIDEVICEID uDeviceID)
+{
+    LPWINE_MCIDRIVER	wmd;
+
+    TRACE("(%04x)\n", uDeviceID);
+
+    wmd = MCI_GetDriver(uDeviceID);
+
+    if (!wmd) {
+	WARN("Bad uDeviceID\n");
+	return 0L;
+    }
+
+    return wmd->dwPrivate;
+}
+
+/**************************************************************************
+ * 			mciSetDriverData			[WINMM.@]
+ */
+BOOL WINAPI mciSetDriverData(MCIDEVICEID uDeviceID, DWORD data)
+{
+    LPWINE_MCIDRIVER	wmd;
+
+    TRACE("(%04x, %08lx)\n", uDeviceID, data);
+
+    wmd = MCI_GetDriver(uDeviceID);
+
+    if (!wmd) {
+	WARN("Bad uDeviceID\n");
+	return FALSE;
+    }
+
+    wmd->dwPrivate = data;
+    return TRUE;
+}
+
+/**************************************************************************
+ * 				mciSendCommandW			[WINMM.@]
+ *
+ */
+DWORD WINAPI mciSendCommandW(MCIDEVICEID wDevID, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
+{
+    DWORD	dwRet;
+
+    TRACE("(%08x, %s, %08lx, %08lx)\n",
+	  wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2);
+
+    dwRet = MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2, TRUE);
+    dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2);
+    TRACE("=> %08lx\n", dwRet);
+    return dwRet;
+}
+
+/**************************************************************************
+ * 				mciSendCommandA			[WINMM.@]
+ */
+DWORD WINAPI mciSendCommandA(MCIDEVICEID wDevID, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
+{
+    DWORD ret;
+    int mapped;
+
+    TRACE("(%08x, %s, %08lx, %08lx)\n",
+	  wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2);
+
+    mapped = MCI_MapMsgAtoW(wMsg, dwParam1, &dwParam2);
+    if (mapped == -1)
+    {
+        FIXME("message %04x mapping failed\n", wMsg);
+        return MMSYSERR_NOMEM;
+    }
+    ret = mciSendCommandW(wDevID, wMsg, dwParam1, dwParam2);
+    if (mapped)
+        MCI_UnmapMsgAtoW(wMsg, dwParam1, dwParam2, ret);
+    return ret;
+}
+
+/**************************************************************************
+ * 				mciGetDeviceIDA    		[WINMM.@]
+ */
+UINT WINAPI mciGetDeviceIDA(LPCSTR lpstrName)
+{
+    LPWSTR w = MCI_strdupAtoW(lpstrName);
+    UINT ret = MCIERR_OUT_OF_MEMORY;
+
+    if (w)
+    {
+        ret = mciGetDeviceIDW(w);
+        HeapFree(GetProcessHeap(), 0, w);
+    }
+    return ret;
+}
+
+/**************************************************************************
+ * 				mciGetDeviceIDW		       	[WINMM.@]
+ */
+UINT WINAPI mciGetDeviceIDW(LPCWSTR lpwstrName)
+{
+    return MCI_GetDriverFromString(lpwstrName); 
+}
+
+/******************************************************************
+ *		MyUserYield
+ *
+ * Internal wrapper to call USER.UserYield16 (in fact through a Wine only export from USER32).
+ */
+static void MyUserYield(void)
+{
+    HMODULE mod = GetModuleHandleA( "user32.dll" );
+    if (mod)
+    {
+        FARPROC proc = GetProcAddress( mod, "UserYield16" );
+        if (proc) proc();
+    }
+}
+
+/**************************************************************************
+ * 				MCI_DefYieldProc	       	[internal]
+ */
+UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data)
+{
+    INT16	ret;
+
+    TRACE("(0x%04x, 0x%08lx)\n", wDevID, data);
+
+    if ((HIWORD(data) != 0 && HWND_16(GetActiveWindow()) != HIWORD(data)) ||
+	(GetAsyncKeyState(LOWORD(data)) & 1) == 0) {
+	MyUserYield();
+	ret = 0;
+    } else {
+	MSG		msg;
+
+	msg.hwnd = HWND_32(HIWORD(data));
+	while (!PeekMessageW(&msg, msg.hwnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE));
+	ret = -1;
+    }
+    return ret;
+}
+
+/**************************************************************************
+ * 				mciSetYieldProc			[WINMM.@]
+ */
+BOOL WINAPI mciSetYieldProc(MCIDEVICEID uDeviceID, YIELDPROC fpYieldProc, DWORD dwYieldData)
+{
+    LPWINE_MCIDRIVER	wmd;
+
+    TRACE("(%u, %p, %08lx)\n", uDeviceID, fpYieldProc, dwYieldData);
+
+    if (!(wmd = MCI_GetDriver(uDeviceID))) {
+	WARN("Bad uDeviceID\n");
+	return FALSE;
+    }
+
+    wmd->lpfnYieldProc = fpYieldProc;
+    wmd->dwYieldData   = dwYieldData;
+    wmd->bIs32         = TRUE;
+
+    return TRUE;
+}
+
+/**************************************************************************
+ * 				mciGetDeviceIDFromElementIDA	[WINMM.@]
+ */
+UINT WINAPI mciGetDeviceIDFromElementIDA(DWORD dwElementID, LPCSTR lpstrType)
+{
+    LPWSTR w = MCI_strdupAtoW(lpstrType);
+    UINT ret = 0;
+
+    if (w)
+    {
+        ret = mciGetDeviceIDFromElementIDW(dwElementID, w);
+        HeapFree(GetProcessHeap(), 0, w);
+    }
+    return ret;
+}
+
+/**************************************************************************
+ * 				mciGetDeviceIDFromElementIDW	[WINMM.@]
+ */
+UINT WINAPI mciGetDeviceIDFromElementIDW(DWORD dwElementID, LPCWSTR lpstrType)
+{
+    /* FIXME: that's rather strange, there is no
+     * mciGetDeviceIDFromElementID32A in winmm.spec
+     */
+    FIXME("(%lu, %s) stub\n", dwElementID, debugstr_w(lpstrType));
+    return 0;
+}
+
+/**************************************************************************
+ * 				mciGetYieldProc			[WINMM.@]
+ */
+YIELDPROC WINAPI mciGetYieldProc(MCIDEVICEID uDeviceID, DWORD* lpdwYieldData)
+{
+    LPWINE_MCIDRIVER	wmd;
+
+    TRACE("(%u, %p)\n", uDeviceID, lpdwYieldData);
+
+    if (!(wmd = MCI_GetDriver(uDeviceID))) {
+	WARN("Bad uDeviceID\n");
+	return NULL;
+    }
+    if (!wmd->lpfnYieldProc) {
+	WARN("No proc set\n");
+	return NULL;
+    }
+    if (!wmd->bIs32) {
+	WARN("Proc is 32 bit\n");
+	return NULL;
+    }
+    return wmd->lpfnYieldProc;
+}
+
+/**************************************************************************
+ * 				mciGetCreatorTask		[WINMM.@]
+ */
+HTASK WINAPI mciGetCreatorTask(MCIDEVICEID uDeviceID)
+{
+    LPWINE_MCIDRIVER	wmd;
+    HTASK ret = 0;
+
+    if ((wmd = MCI_GetDriver(uDeviceID))) ret = (HTASK)wmd->CreatorThread;
+
+    TRACE("(%u) => %p\n", uDeviceID, ret);
+    return ret;
+}
+
+/**************************************************************************
+ * 			mciDriverYield				[WINMM.@]
+ */
+UINT WINAPI mciDriverYield(MCIDEVICEID uDeviceID)
+{
+    LPWINE_MCIDRIVER	wmd;
+    UINT		ret = 0;
+
+    TRACE("(%04x)\n", uDeviceID);
+
+    if (!(wmd = MCI_GetDriver(uDeviceID)) || !wmd->lpfnYieldProc || !wmd->bIs32) {
+	MyUserYield();
+    } else {
+	ret = wmd->lpfnYieldProc(uDeviceID, wmd->dwYieldData);
+    }
+
+    return ret;
+}
diff --git a/dlls/winmm/mcianim/mcianim.c b/dlls/winmm/mcianim/mcianim.c
index b12cb9e..e10fc76 100644
--- a/dlls/winmm/mcianim/mcianim.c
+++ b/dlls/winmm/mcianim/mcianim.c
@@ -28,6 +28,7 @@
 #include "wownt32.h"
 #include "mmddk.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mcianim);
 
@@ -40,7 +41,7 @@
         int     	nUseCount;          /* Incremented for each shared open */
         BOOL		fShareable;         /* TRUE if first open was shareable */
         WORD    	wNotifyDeviceID;    /* MCI device ID with a pending notification */
-	MCI_OPEN_PARMSA openParms;
+	MCI_OPEN_PARMSW openParms;
 	DWORD		dwTimeFormat;
 	int		mode;
 	UINT		nCurTrack;
@@ -56,7 +57,7 @@
 /**************************************************************************
  * 				MCIANIM_drvOpen			[internal]
  */
-static	DWORD	MCIANIM_drvOpen(LPSTR str, LPMCI_OPEN_DRIVER_PARMSA modp)
+static	DWORD	MCIANIM_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
 {
     WINE_MCIANIM*	wma;
 
@@ -105,7 +106,7 @@
 /**************************************************************************
  * 				MCIANIM_mciOpen			[internal]
  */
-static DWORD MCIANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSA lpOpenParms)
+static DWORD MCIANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms)
 {
     DWORD		dwDeviceID;
     WINE_MCIANIM*	wma = (WINE_MCIANIM*)mciGetDriverData(wDevID);
@@ -136,8 +137,8 @@
 
     /*TRACE("lpParms->wDevID=%04X\n", lpParms->wDeviceID);*/
     if (dwFlags & MCI_OPEN_ELEMENT) {
-	TRACE("MCI_OPEN_ELEMENT '%s' !\n", lpOpenParms->lpstrElementName);
-	if (lpOpenParms->lpstrElementName && strlen(lpOpenParms->lpstrElementName) > 0) {
+	TRACE("MCI_OPEN_ELEMENT %s!\n", debugstr_w(lpOpenParms->lpstrElementName));
+	if (lpOpenParms->lpstrElementName && strlenW(lpOpenParms->lpstrElementName) > 0) {
 	}
 	FIXME("element is not opened\n");
     }
@@ -343,11 +344,13 @@
 /**************************************************************************
  * 				MCIANIM_mciInfo			[internal]
  */
-static DWORD MCIANIM_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMSA lpParms)
+static DWORD MCIANIM_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)
 {
     WINE_MCIANIM*	wma = MCIANIM_mciGetOpenDrv(wDevID);
-    LPCSTR		str = 0;
+    LPCWSTR		str = 0;
     DWORD		ret = 0;
+    static const WCHAR wszAnimation[] = {'W','i','n','e','\'','s',' ','a','n','i','m','a','t','i','o','n',0};
+    static const WCHAR wszWindow   [] = {'A','n','i','m','a','t','i','o','n',' ','W','i','n','d','o','w',0};
 
     TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 
@@ -360,26 +363,20 @@
     TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
 
     switch(dwFlags) {
-    case MCI_INFO_PRODUCT:
-	str = "Wine's animation";
-	break;
-    case MCI_INFO_FILE:
-	str = wma->openParms.lpstrElementName;
-	break;
-    case MCI_ANIM_INFO_TEXT:
-	str = "Animation Window";
-	break;
+    case MCI_INFO_PRODUCT:      str = wszAnimation; break;
+    case MCI_INFO_FILE:         str = wma->openParms.lpstrElementName; break;
+    case MCI_ANIM_INFO_TEXT:    str = wszWindow; break;
     default:
 	WARN("Don't know this info command (%lu)\n", dwFlags);
 	return MCIERR_UNRECOGNIZED_COMMAND;
     }
 
     if (str) {
-	if (lpParms->dwRetSize <= strlen(str)) {
-	    lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1);
+	if (lpParms->dwRetSize <= strlenW(str)) {
+	    lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1);
 	    ret = MCIERR_PARAM_OVERFLOW;
 	} else {
-	    strcpy(lpParms->lpstrReturn, str);
+	    strcpyW(lpParms->lpstrReturn, str);
 	}
     } else {
 	*lpParms->lpstrReturn = 0;
@@ -658,7 +655,7 @@
     switch (wMsg) {
     case DRV_LOAD:		return 1;
     case DRV_FREE:		return 1;
-    case DRV_OPEN:		return MCIANIM_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2);
+    case DRV_OPEN:		return MCIANIM_drvOpen((LPCWSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSW)dwParam2);
     case DRV_CLOSE:		return MCIANIM_drvClose(dwDevID);
     case DRV_ENABLE:		return 1;
     case DRV_DISABLE:		return 1;
@@ -671,10 +668,10 @@
     if (dwDevID == 0xFFFFFFFF) return MCIERR_UNSUPPORTED_FUNCTION;
 
     switch (wMsg) {
-    case MCI_OPEN_DRIVER:	return MCIANIM_mciOpen(dwDevID, dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
+    case MCI_OPEN_DRIVER:	return MCIANIM_mciOpen(dwDevID, dwParam1, (LPMCI_OPEN_PARMSW)dwParam2);
     case MCI_CLOSE_DRIVER:	return MCIANIM_mciClose(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
     case MCI_GETDEVCAPS:	return MCIANIM_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
-    case MCI_INFO:		return MCIANIM_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMSA)dwParam2);
+    case MCI_INFO:		return MCIANIM_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMSW)dwParam2);
     case MCI_STATUS:		return MCIANIM_mciStatus(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);
     case MCI_SET:		return MCIANIM_mciSet(dwDevID, dwParam1, (LPMCI_SET_PARMS)dwParam2);
     case MCI_PLAY:		return MCIANIM_mciPlay(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);
diff --git a/dlls/winmm/mciavi/info.c b/dlls/winmm/mciavi/info.c
index 688d68f..69be75f 100644
--- a/dlls/winmm/mciavi/info.c
+++ b/dlls/winmm/mciavi/info.c
@@ -23,6 +23,7 @@
 #include <string.h>
 #include "private_mciavi.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mciavi);
 
@@ -148,11 +149,12 @@
 /***************************************************************************
  * 				MCIAVI_mciInfo			[internal]
  */
-DWORD	MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSA lpParms)
+DWORD	MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSW lpParms)
 {
-    LPCSTR		str = 0;
+    LPCWSTR		str = 0;
     WINE_MCIAVI*	wma = MCIAVI_mciGetOpenDev(wDevID);
     DWORD		ret = 0;
+    static const WCHAR wszAviPlayer[] = {'W','i','n','e','\'','s',' ','A','V','I',' ','p','l','a','y','e','r',0};
 
     if (lpParms == NULL || lpParms->lpstrReturn == NULL)
 	return MCIERR_NULL_PARAMETER_BLOCK;
@@ -163,22 +165,18 @@
     EnterCriticalSection(&wma->cs);
 
     switch (dwFlags) {
-    case MCI_INFO_PRODUCT:
-	str = "Wine's AVI player";
-	break;
-    case MCI_INFO_FILE:
-       str = wma->lpFileName;
-	break;
+    case MCI_INFO_PRODUCT:      str = wszAviPlayer; break;
+    case MCI_INFO_FILE:         str = wma->lpFileName; break;
     default:
 	WARN("Don't know this info command (%lu)\n", dwFlags);
         LeaveCriticalSection(&wma->cs);
 	return MCIERR_UNRECOGNIZED_COMMAND;
     }
     if (str) {
-	if (strlen(str) + 1 > lpParms->dwRetSize) {
+	if (strlenW(str) + 1 > lpParms->dwRetSize) {
 	    ret = MCIERR_PARAM_OVERFLOW;
 	} else {
-	    lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize);
+	    lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize);
 	}
     } else {
 	lpParms->lpstrReturn[0] = 0;
@@ -325,7 +323,7 @@
 /***************************************************************************
  * 				MCIAVI_mciStatus			[internal]
  */
-DWORD	MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSA lpParms)
+DWORD	MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpParms)
 {
     WINE_MCIAVI*	wma = MCIAVI_mciGetOpenDev(wDevID);
     DWORD		ret = 0;
diff --git a/dlls/winmm/mciavi/mciavi.c b/dlls/winmm/mciavi/mciavi.c
index 88d4778..6eb844c 100644
--- a/dlls/winmm/mciavi/mciavi.c
+++ b/dlls/winmm/mciavi/mciavi.c
@@ -1,4 +1,4 @@
-/* -*- tab-width: 8; c-basic-offset: 4 -*- */
+
 
 /*
  * Digital video MCI Wine Driver
@@ -40,6 +40,7 @@
 #include <string.h>
 #include "private_mciavi.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mciavi);
 
@@ -135,12 +136,12 @@
 /**************************************************************************
  * 				MCIAVI_drvOpen			[internal]
  */
-static	DWORD	MCIAVI_drvOpen(LPSTR str, LPMCI_OPEN_DRIVER_PARMSA modp)
+static	DWORD	MCIAVI_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
 {
     WINE_MCIAVI*	wma;
     static const WCHAR mciAviWStr[] = {'M','C','I','A','V','I',0};
 
-    TRACE("%s, %p\n", debugstr_a(str), modp);
+    TRACE("%s, %p\n", debugstr_w(str), modp);
 
     /* session instance */
     if (!modp) return 0xFFFFFFFF;
@@ -274,7 +275,7 @@
  * 				MCIAVI_mciOpen			[internal]
  */
 static	DWORD	MCIAVI_mciOpen(UINT wDevID, DWORD dwFlags,
-			    LPMCI_DGV_OPEN_PARMSA lpOpenParms)
+                               LPMCI_DGV_OPEN_PARMSW lpOpenParms)
 {
     WINE_MCIAVI *wma;
     LRESULT		dwRet = 0;
@@ -314,20 +315,20 @@
 	     * contains the hFile value ?
 	     */
 	    dwRet = MCIERR_UNRECOGNIZED_COMMAND;
-	} else if (strlen(lpOpenParms->lpstrElementName) > 0) {
+	} else if (strlenW(lpOpenParms->lpstrElementName) > 0) {
 	    /* FIXME : what should be done id wma->hFile is already != 0, or the driver is playin' */
-	    TRACE("MCI_OPEN_ELEMENT '%s' !\n", lpOpenParms->lpstrElementName);
+	    TRACE("MCI_OPEN_ELEMENT %s!\n", debugstr_w(lpOpenParms->lpstrElementName));
 
-           if (lpOpenParms->lpstrElementName && (strlen(lpOpenParms->lpstrElementName) > 0))
+            if (lpOpenParms->lpstrElementName && (strlenW(lpOpenParms->lpstrElementName) > 0))
             {
-                wma->lpFileName = HeapAlloc(GetProcessHeap(), 0, strlen(lpOpenParms->lpstrElementName) + 1);
-                strcpy(wma->lpFileName, lpOpenParms->lpstrElementName);
+                wma->lpFileName = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpOpenParms->lpstrElementName) + 1) * sizeof(WCHAR));
+                strcpyW(wma->lpFileName, lpOpenParms->lpstrElementName);
 
-		wma->hFile = mmioOpenA(lpOpenParms->lpstrElementName, NULL,
+		wma->hFile = mmioOpenW(lpOpenParms->lpstrElementName, NULL,
 				       MMIO_ALLOCBUF | MMIO_DENYWRITE | MMIO_READ);
 
 		if (wma->hFile == 0) {
-		    WARN("can't find file='%s' !\n", lpOpenParms->lpstrElementName);
+		    WARN("can't find file=%s!\n", debugstr_w(lpOpenParms->lpstrElementName));
 		    dwRet = MCIERR_FILE_NOT_FOUND;
 		} else {
 		    if (!MCIAVI_GetInfo(wma))
@@ -750,7 +751,7 @@
 /*****************************************************************************
  * 				MCIAVI_mciLoad			[internal]
  */
-static DWORD	MCIAVI_mciLoad(UINT wDevID, DWORD dwFlags, LPMCI_DGV_LOAD_PARMSA lpParms)
+static DWORD	MCIAVI_mciLoad(UINT wDevID, DWORD dwFlags, LPMCI_DGV_LOAD_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -769,7 +770,7 @@
 /******************************************************************************
  * 				MCIAVI_mciSave			[internal]
  */
-static	DWORD	MCIAVI_mciSave(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SAVE_PARMSA lpParms)
+static	DWORD	MCIAVI_mciSave(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SAVE_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -983,7 +984,7 @@
 /******************************************************************************
  * 				MCIAVI_mciCapture			[internal]
  */
-static	DWORD	MCIAVI_mciCapture(UINT wDevID, DWORD dwFlags, LPMCI_DGV_CAPTURE_PARMSA lpParms)
+static	DWORD	MCIAVI_mciCapture(UINT wDevID, DWORD dwFlags, LPMCI_DGV_CAPTURE_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -1021,7 +1022,7 @@
 /******************************************************************************
  * 				MCIAVI_mciReserve			[internal]
  */
-static	DWORD	MCIAVI_mciReserve(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RESERVE_PARMSA lpParms)
+static	DWORD	MCIAVI_mciReserve(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RESERVE_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -1040,7 +1041,7 @@
 /******************************************************************************
  * 				MCIAVI_mciSetAudio			[internal]
  */
-static	DWORD	MCIAVI_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_PARMSA lpParms)
+static	DWORD	MCIAVI_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -1078,7 +1079,7 @@
 /******************************************************************************
  * 				MCIAVI_mciSetVideo			[internal]
  */
-static	DWORD	MCIAVI_mciSetVideo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_PARMSA lpParms)
+static	DWORD	MCIAVI_mciSetVideo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -1097,7 +1098,7 @@
 /******************************************************************************
  * 				MCIAVI_mciQuality			[internal]
  */
-static	DWORD	MCIAVI_mciQuality(UINT wDevID, DWORD dwFlags, LPMCI_DGV_QUALITY_PARMSA lpParms)
+static	DWORD	MCIAVI_mciQuality(UINT wDevID, DWORD dwFlags, LPMCI_DGV_QUALITY_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -1116,7 +1117,7 @@
 /******************************************************************************
  * 				MCIAVI_mciList			[internal]
  */
-static	DWORD	MCIAVI_mciList(UINT wDevID, DWORD dwFlags, LPMCI_DGV_LIST_PARMSA lpParms)
+static	DWORD	MCIAVI_mciList(UINT wDevID, DWORD dwFlags, LPMCI_DGV_LIST_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -1173,7 +1174,7 @@
 /******************************************************************************
  * 				MCIAVI_mciRestore			[internal]
  */
-static	DWORD	MCIAVI_mciRestore(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RESTORE_PARMSA lpParms)
+static	DWORD	MCIAVI_mciRestore(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RESTORE_PARMSW lpParms)
 {
     WINE_MCIAVI *wma;
 
@@ -1205,7 +1206,7 @@
     switch (wMsg) {
     case DRV_LOAD:		return 1;
     case DRV_FREE:		return 1;
-    case DRV_OPEN:		return MCIAVI_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2);
+    case DRV_OPEN:		return MCIAVI_drvOpen((LPCWSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSW)dwParam2);
     case DRV_CLOSE:		return MCIAVI_drvClose(dwDevID);
     case DRV_ENABLE:		return 1;
     case DRV_DISABLE:		return 1;
@@ -1219,7 +1220,7 @@
     if (dwDevID == 0xFFFFFFFF) return 1;
 
     switch (wMsg) {
-    case MCI_OPEN_DRIVER:	return MCIAVI_mciOpen      (dwDevID, dwParam1, (LPMCI_DGV_OPEN_PARMSA)     dwParam2);
+    case MCI_OPEN_DRIVER:	return MCIAVI_mciOpen      (dwDevID, dwParam1, (LPMCI_DGV_OPEN_PARMSW)     dwParam2);
     case MCI_CLOSE_DRIVER:	return MCIAVI_mciClose     (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)       dwParam2);
     case MCI_PLAY:		return MCIAVI_mciPlay      (dwDevID, dwParam1, (LPMCI_PLAY_PARMS)          dwParam2);
     case MCI_RECORD:		return MCIAVI_mciRecord    (dwDevID, dwParam1, (LPMCI_DGV_RECORD_PARMS)    dwParam2);
@@ -1227,14 +1228,14 @@
     case MCI_SET:		return MCIAVI_mciSet       (dwDevID, dwParam1, (LPMCI_DGV_SET_PARMS)       dwParam2);
     case MCI_PAUSE:		return MCIAVI_mciPause     (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)       dwParam2);
     case MCI_RESUME:		return MCIAVI_mciResume    (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)       dwParam2);
-    case MCI_STATUS:		return MCIAVI_mciStatus    (dwDevID, dwParam1, (LPMCI_DGV_STATUS_PARMSA)   dwParam2);
+    case MCI_STATUS:		return MCIAVI_mciStatus    (dwDevID, dwParam1, (LPMCI_DGV_STATUS_PARMSW)   dwParam2);
     case MCI_GETDEVCAPS:	return MCIAVI_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)    dwParam2);
-    case MCI_INFO:		return MCIAVI_mciInfo      (dwDevID, dwParam1, (LPMCI_DGV_INFO_PARMSA)     dwParam2);
+    case MCI_INFO:		return MCIAVI_mciInfo      (dwDevID, dwParam1, (LPMCI_DGV_INFO_PARMSW)     dwParam2);
     case MCI_SEEK:		return MCIAVI_mciSeek      (dwDevID, dwParam1, (LPMCI_SEEK_PARMS)          dwParam2);
     case MCI_PUT:		return MCIAVI_mciPut	   (dwDevID, dwParam1, (LPMCI_DGV_PUT_PARMS)       dwParam2);
-    case MCI_WINDOW:		return MCIAVI_mciWindow	   (dwDevID, dwParam1, (LPMCI_DGV_WINDOW_PARMSA)   dwParam2);
-    case MCI_LOAD:		return MCIAVI_mciLoad      (dwDevID, dwParam1, (LPMCI_DGV_LOAD_PARMSA)     dwParam2);
-    case MCI_SAVE:		return MCIAVI_mciSave      (dwDevID, dwParam1, (LPMCI_DGV_SAVE_PARMSA)     dwParam2);
+    case MCI_WINDOW:		return MCIAVI_mciWindow	   (dwDevID, dwParam1, (LPMCI_DGV_WINDOW_PARMSW)   dwParam2);
+    case MCI_LOAD:		return MCIAVI_mciLoad      (dwDevID, dwParam1, (LPMCI_DGV_LOAD_PARMSW)     dwParam2);
+    case MCI_SAVE:		return MCIAVI_mciSave      (dwDevID, dwParam1, (LPMCI_DGV_SAVE_PARMSW)     dwParam2);
     case MCI_FREEZE:		return MCIAVI_mciFreeze	   (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS)      dwParam2);
     case MCI_REALIZE:		return MCIAVI_mciRealize   (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)       dwParam2);
     case MCI_UNFREEZE:		return MCIAVI_mciUnFreeze  (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS)      dwParam2);
@@ -1247,17 +1248,17 @@
     case MCI_PASTE:		return MCIAVI_mciPaste     (dwDevID, dwParam1, (LPMCI_DGV_PASTE_PARMS)     dwParam2);
     case MCI_CUE:		return MCIAVI_mciCue       (dwDevID, dwParam1, (LPMCI_DGV_CUE_PARMS)       dwParam2);
 	/* Digital Video specific */
-    case MCI_CAPTURE:		return MCIAVI_mciCapture   (dwDevID, dwParam1, (LPMCI_DGV_CAPTURE_PARMSA)  dwParam2);
+    case MCI_CAPTURE:		return MCIAVI_mciCapture   (dwDevID, dwParam1, (LPMCI_DGV_CAPTURE_PARMSW)  dwParam2);
     case MCI_MONITOR:		return MCIAVI_mciMonitor   (dwDevID, dwParam1, (LPMCI_DGV_MONITOR_PARMS)   dwParam2);
-    case MCI_RESERVE:		return MCIAVI_mciReserve   (dwDevID, dwParam1, (LPMCI_DGV_RESERVE_PARMSA)  dwParam2);
-    case MCI_SETAUDIO:		return MCIAVI_mciSetAudio  (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSA) dwParam2);
+    case MCI_RESERVE:		return MCIAVI_mciReserve   (dwDevID, dwParam1, (LPMCI_DGV_RESERVE_PARMSW)  dwParam2);
+    case MCI_SETAUDIO:		return MCIAVI_mciSetAudio  (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSW) dwParam2);
     case MCI_SIGNAL:		return MCIAVI_mciSignal    (dwDevID, dwParam1, (LPMCI_DGV_SIGNAL_PARMS)    dwParam2);
-    case MCI_SETVIDEO:		return MCIAVI_mciSetVideo  (dwDevID, dwParam1, (LPMCI_DGV_SETVIDEO_PARMSA) dwParam2);
-    case MCI_QUALITY:		return MCIAVI_mciQuality   (dwDevID, dwParam1, (LPMCI_DGV_QUALITY_PARMSA)  dwParam2);
-    case MCI_LIST:		return MCIAVI_mciList      (dwDevID, dwParam1, (LPMCI_DGV_LIST_PARMSA)     dwParam2);
+    case MCI_SETVIDEO:		return MCIAVI_mciSetVideo  (dwDevID, dwParam1, (LPMCI_DGV_SETVIDEO_PARMSW) dwParam2);
+    case MCI_QUALITY:		return MCIAVI_mciQuality   (dwDevID, dwParam1, (LPMCI_DGV_QUALITY_PARMSW)  dwParam2);
+    case MCI_LIST:		return MCIAVI_mciList      (dwDevID, dwParam1, (LPMCI_DGV_LIST_PARMSW)     dwParam2);
     case MCI_UNDO:		return MCIAVI_mciUndo      (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)       dwParam2);
     case MCI_CONFIGURE:		return MCIAVI_mciConfigure (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)       dwParam2);
-    case MCI_RESTORE:		return MCIAVI_mciRestore   (dwDevID, dwParam1, (LPMCI_DGV_RESTORE_PARMSA)  dwParam2);
+    case MCI_RESTORE:		return MCIAVI_mciRestore   (dwDevID, dwParam1, (LPMCI_DGV_RESTORE_PARMSW)  dwParam2);
 
     case MCI_SPIN:
     case MCI_ESCAPE:
diff --git a/dlls/winmm/mciavi/mciavi_res.rc b/dlls/winmm/mciavi/mciavi_res.rc
index 14fe2e0..a620d69 100644
--- a/dlls/winmm/mciavi/mciavi_res.rc
+++ b/dlls/winmm/mciavi/mciavi_res.rc
@@ -23,543 +23,543 @@
 
 MCIAVI RCDATA
 BEGIN
-"play\0", 0x00000806L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"repeat\0", 0x00010000L, MCI_FLAG,
-"reverse\0", 0x00020000L, MCI_FLAG,
-"window\0", 0x01000000L, MCI_FLAG,
-"fullscreen by 2\0", 0x04000000L, MCI_FLAG,
-"fullscreen\0", 0x02000000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"can record\0", 0x00000001L, MCI_INTEGER,
-"has audio\0", 0x00000002L, MCI_INTEGER,
-"has video\0", 0x00000003L, MCI_INTEGER,
-"uses files\0", 0x00000005L, MCI_INTEGER,
-"compound device\0", 0x00000006L, MCI_INTEGER,
-"device type\0", 0x00000004L, MCI_INTEGER,
-"can eject\0", 0x00000007L, MCI_INTEGER,
-"can play\0", 0x00000008L, MCI_INTEGER,
-"can save\0", 0x00000009L, MCI_INTEGER,
-"can lock\0", 0x00004000L, MCI_INTEGER,
-"can reverse\0", 0x00004004L, MCI_INTEGER,
-"can stretch input\0", 0x00004008L, MCI_INTEGER,
-"can stretch\0", 0x00004001L, MCI_INTEGER,
-"can test\0", 0x00004009L, MCI_INTEGER,
-"has still\0", 0x00004005L, MCI_INTEGER,
-"can freeze\0", 0x00004002L, MCI_INTEGER,
-"uses palettes\0", 0x00004006L, MCI_INTEGER,
-"windows\0", 0x00004003L, MCI_INTEGER,
-"maximum play rate\0", 0x0000400aL, MCI_INTEGER,
-"minimum play rate\0", 0x0000400bL, MCI_INTEGER,
-"can colorkey\0", 0x00004100L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"capture\0", 0x00000870L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"as\0", 0x00010000L, MCI_STRING,
-"at\0", 0x00020000L, MCI_RECT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"close\0", 0x00000804L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"configure\0", 0x0000087aL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"copy\0", 0x00000852L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"at\0", 0x00010000L, MCI_RECT,
-"audio stream\0", 0x00020000L, MCI_INTEGER,
-"video stream\0", 0x00040000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"cue\0", 0x00000830L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"input\0", 0x00010000L, MCI_FLAG,
-"output\0", 0x00020000L, MCI_FLAG,
-"to\0", 0x00000008L, MCI_INTEGER,
-"noshow\0", 0x00040000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"cut\0", 0x00000851L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"at\0", 0x00010000L, MCI_RECT,
-"audio stream\0", 0x00020000L, MCI_INTEGER,
-"video stream\0", 0x00040000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"delete\0", 0x00000856L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"at\0", 0x00010000L, MCI_RECT,
-"audio stream\0", 0x00020000L, MCI_INTEGER,
-"video stream\0", 0x00040000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"freeze\0", 0x00000844L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"outside\0", 0x00020000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"file\0", 0x00000200L, MCI_FLAG,
-"product\0", 0x00000100L, MCI_FLAG,
-"window text\0", 0x00010000L, MCI_FLAG,
-"usage\0", 0x00004000L, MCI_FLAG,
-"version\0", 0x00000400L, MCI_FLAG,
-"\0", 0x00020000L, MCI_CONSTANT,
-"audio algorithm\0", 0x00004004L, MCI_INTEGER,
-"audio quality\0", 0x00004001L, MCI_INTEGER,
-"still algorithm\0", 0x00004005L, MCI_INTEGER,
-"still quality\0", 0x00004002L, MCI_INTEGER,
-"video algorithm\0", 0x00004006L, MCI_INTEGER,
-"video quality\0", 0x00004003L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"list\0", 0x00000878L, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"count\0", 0x00020000L, MCI_FLAG,
-"number\0", 0x00040000L, MCI_INTEGER,
-"\0", 0x00010000L, MCI_CONSTANT,
-"audio algorithm\0", 0x00004000L, MCI_INTEGER,
-"audio quality\0", 0x00004001L, MCI_INTEGER,
-"audio stream\0", 0x00004002L, MCI_INTEGER,
-"still algorithm\0", 0x00004003L, MCI_INTEGER,
-"still quality\0", 0x00004004L, MCI_INTEGER,
-"video algorithm\0", 0x00004005L, MCI_INTEGER,
-"video quality\0", 0x00004006L, MCI_INTEGER,
-"video source\0", 0x00004008L, MCI_INTEGER,
-"video stream\0", 0x00004007L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"algorithm\0", 0x00080000L, MCI_STRING,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"load\0", 0x00000850L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00000100L, MCI_STRING,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"monitor\0", 0x00000871L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00020000L, MCI_CONSTANT,
-"input\0", 0x00004000L, MCI_INTEGER,
-"file\0", 0x00004001L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"method\0", 0x00010000L, MCI_CONSTANT,
-"pre\0", 0x0000a000L, MCI_INTEGER,
-"post\0", 0x0000a001L, MCI_INTEGER,
-"direct\0", 0x0000a002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"open\0", 0x00000803L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"type\0", 0x00002000L, MCI_STRING,
-"element\0", 0x00000200L, MCI_STRING,
-"alias\0", 0x00000400L, MCI_STRING,
-"shareable\0", 0x00000100L, MCI_FLAG,
-"style\0", 0x00010000L, MCI_CONSTANT,
-"overlapped\0", 0x00cf0000L, MCI_INTEGER,
-"popup\0", 0x80880000L, MCI_INTEGER,
-"child\0", 0x40000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"parent\0", 0x00020000L, MCI_INTEGER,
-"nostatic\0", 0x00040000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"paste\0", 0x00000853L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"to\0", 0x00000008L, MCI_INTEGER,
-"at\0", 0x00010000L, MCI_RECT,
-"insert\0", 0x00080000L, MCI_FLAG,
-"overwrite\0", 0x00100000L, MCI_FLAG,
-"audio stream\0", 0x00020000L, MCI_INTEGER,
-"video stream\0", 0x00040000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"pause\0", 0x00000809L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"put\0", 0x00000842L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"source\0", 0x00020000L, MCI_FLAG,
-"destination\0", 0x00040000L, MCI_FLAG,
-"frame\0", 0x00080000L, MCI_FLAG,
-"video\0", 0x00100000L, MCI_FLAG,
-"window\0", 0x00200000L, MCI_FLAG,
-"client\0", 0x00400000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"quality\0", 0x00000877L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00010000L, MCI_CONSTANT,
-"audio\0", 0x00004000L, MCI_INTEGER,
-"still\0", 0x00004001L, MCI_INTEGER,
-"video\0", 0x00004002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"name\0", 0x00020000L, MCI_STRING,
-"algorithm\0", 0x00040000L, MCI_STRING,
-"dialog\0", 0x00080000L, MCI_FLAG,
-"handle\0", 0x00100000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"realize\0", 0x00000840L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"normal\0", 0x00010000L, MCI_FLAG,
-"background\0", 0x00020000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"record\0", 0x0000080fL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"insert\0", 0x00000100L, MCI_FLAG,
-"overwrite\0", 0x00000200L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"hold\0", 0x00020000L, MCI_FLAG,
-"audio stream\0", 0x00040000L, MCI_INTEGER,
-"video stream\0", 0x00080000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"reserve\0", 0x00000872L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"in\0", 0x00010000L, MCI_STRING,
-"size\0", 0x00020000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"restore\0", 0x0000087bL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"from\0", 0x00010000L, MCI_STRING,
-"at\0", 0x00020000L, MCI_RECT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"resume\0", 0x00000855L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"save\0", 0x00000813L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00000100L, MCI_STRING,
-"at\0", 0x00010000L, MCI_RECT,
-"abort\0", 0x00020000L, MCI_FLAG,
-"keepreserve\0", 0x00040000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"seek\0", 0x00000807L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"to start\0", 0x00000100L, MCI_FLAG,
-"to end\0", 0x00000200L, MCI_FLAG,
-"to\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"time format\0", 0x00000400L, MCI_CONSTANT,
-"frames\0", 0x00000003L, MCI_INTEGER,
-"milliseconds\0", 0x00000000L, MCI_INTEGER,
-"ms\0", 0x00000000L, MCI_INTEGER,
-"bytes\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"door open\0", 0x00000100L, MCI_FLAG,
-"door closed\0", 0x00000200L, MCI_FLAG,
-"audio\0", 0x00000800L, MCI_CONSTANT,
-"all\0", 0x00000000L, MCI_INTEGER,
-"left\0", 0x00000001L, MCI_INTEGER,
-"right\0", 0x00000002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"video\0", 0x00001000L, MCI_FLAG,
-"seek exactly\0", 0x00010000L, MCI_FLAG,
-"file format\0", 0x00080000L, MCI_CONSTANT,
-"avss\0", 0x00004000L, MCI_INTEGER,
-"avi\0", 0x00004001L, MCI_INTEGER,
-"dib\0", 0x00004002L, MCI_INTEGER,
-"rdib\0", 0x00004003L, MCI_INTEGER,
-"jpeg\0", 0x00004004L, MCI_INTEGER,
-"rjpeg\0", 0x00004005L, MCI_INTEGER,
-"jfif\0", 0x00004006L, MCI_INTEGER,
-"mpeg\0", 0x00004007L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"still\0", 0x00040000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"speed\0", 0x00020000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"setaudio\0", 0x00000873L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00800000L, MCI_CONSTANT,
-"bass\0", 0x00004001L, MCI_INTEGER,
-"treble\0", 0x00004000L, MCI_INTEGER,
-"volume\0", 0x00004002L, MCI_INTEGER,
-"stream\0", 0x00004003L, MCI_INTEGER,
-"source\0", 0x00004004L, MCI_INTEGER,
-"samplespersec\0", 0x00004005L, MCI_INTEGER,
-"bytespersec\0", 0x00004006L, MCI_INTEGER,
-"alignment\0", 0x00004007L, MCI_INTEGER,
-"bitspersample\0", 0x00004008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"to\0", 0x01000000L, MCI_CONSTANT,
-"left\0", 0x00000001L, MCI_INTEGER,
-"right\0", 0x00000002L, MCI_INTEGER,
-"average\0", 0x00004000L, MCI_INTEGER,
-"stereo\0", 0x00000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"over\0", 0x00010000L, MCI_INTEGER,
-"algorithm\0", 0x00040000L, MCI_STRING,
-"quality\0", 0x00080000L, MCI_STRING,
-"record\0", 0x00100000L, MCI_FLAG,
-"left\0", 0x00200000L, MCI_FLAG,
-"clocktime\0", 0x00020000L, MCI_FLAG,
-"right\0", 0x00400000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"input\0", 0x02000000L, MCI_FLAG,
-"output\0", 0x04000000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"setvideo\0", 0x00000876L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00100000L, MCI_CONSTANT,
-"frame rate\0", 0x00004008L, MCI_INTEGER,
-"brightness\0", 0x00004000L, MCI_INTEGER,
-"color\0", 0x00004001L, MCI_INTEGER,
-"contrast\0", 0x00004002L, MCI_INTEGER,
-"tint\0", 0x00004003L, MCI_INTEGER,
-"sharpness\0", 0x00004004L, MCI_INTEGER,
-"gamma\0", 0x00004005L, MCI_INTEGER,
-"palette handle\0", 0x00004007L, MCI_INTEGER,
-"stream\0", 0x00004006L, MCI_INTEGER,
-"source\0", 0x00004009L, MCI_INTEGER,
-"key index\0", 0x0000400aL, MCI_INTEGER,
-"key color\0", 0x0000400bL, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"to\0", 0x01000000L, MCI_CONSTANT,
-"ntsc\0", 0x00004000L, MCI_INTEGER,
-"rgb\0", 0x00004001L, MCI_INTEGER,
-"svideo\0", 0x00004002L, MCI_INTEGER,
-"pal\0", 0x00004003L, MCI_INTEGER,
-"secam\0", 0x00004004L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"quality\0", 0x00010000L, MCI_STRING,
-"algorithm\0", 0x00020000L, MCI_STRING,
-"number\0", 0x00080000L, MCI_INTEGER,
-"over\0", 0x00200000L, MCI_INTEGER,
-"record\0", 0x00400000L, MCI_FLAG,
-"still\0", 0x00800000L, MCI_FLAG,
-"clocktime\0", 0x00040000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"input\0", 0x02000000L, MCI_FLAG,
-"output\0", 0x04000000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"signal\0", 0x00000875L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_INTEGER,
-"every\0", 0x00020000L, MCI_INTEGER,
-"uservalue\0", 0x00040000L, MCI_INTEGER,
-"cancel\0", 0x00080000L, MCI_FLAG,
-"return position\0", 0x00100000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"status\0", 0x00000814L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"frames skipped\0", 0x00008001L, MCI_INTEGER,
-"play speed\0", 0x00008002L, MCI_INTEGER,
-"audio breaks\0", 0x00008003L, MCI_INTEGER,
-"alignment\0", 0x00004029L, MCI_INTEGER,
-"audio input\0", 0x00004000L, MCI_INTEGER,
-"audio record\0", 0x0000401aL, MCI_INTEGER,
-"audio source\0", 0x00004009L, MCI_INTEGER,
-"audio stream\0", 0x0000402dL, MCI_INTEGER,
-"bass\0", 0x0000400fL, MCI_INTEGER,
-"bitsperpel\0", 0x0000402bL, MCI_INTEGER,
-"bitspersample\0", 0x0000402aL, MCI_INTEGER,
-"brightness\0", 0x00004005L, MCI_INTEGER,
-"bytespersec\0", 0x00004028L, MCI_INTEGER,
-"color\0", 0x00004006L, MCI_INTEGER,
-"contrast\0", 0x00004007L, MCI_INTEGER,
-"current track\0", 0x00000008L, MCI_INTEGER,
-"file format\0", 0x00004008L, MCI_INTEGER,
-"still file format\0", 0x0000401dL, MCI_INTEGER,
-"file mode\0", 0x0000401fL, MCI_INTEGER,
-"file completion\0", 0x00004020L, MCI_INTEGER,
-"forward\0", 0x0000402cL, MCI_INTEGER,
-"gamma\0", 0x0000400aL, MCI_INTEGER,
-"length\0", 0x00000001L, MCI_INTEGER,
-"media present\0", 0x00000005L, MCI_INTEGER,
-"mode\0", 0x00000004L, MCI_INTEGER,
-"monitor method\0", 0x0000400cL, MCI_INTEGER,
-"monitor\0", 0x0000400bL, MCI_INTEGER,
-"number of tracks\0", 0x00000003L, MCI_INTEGER,
-"palette handle\0", 0x00004004L, MCI_INTEGER,
-"pause mode\0", 0x00004026L, MCI_INTEGER,
-"position\0", 0x00000002L, MCI_INTEGER,
-"ready\0", 0x00000007L, MCI_INTEGER,
-"frame rate\0", 0x0000400eL, MCI_INTEGER,
-"reserved size\0", 0x00004010L, MCI_INTEGER,
-"samplespersec\0", 0x00004027L, MCI_INTEGER,
-"seek exactly\0", 0x00004011L, MCI_INTEGER,
-"sharpness\0", 0x00004012L, MCI_INTEGER,
-"smpte\0", 0x00004013L, MCI_INTEGER,
-"speed\0", 0x00004003L, MCI_INTEGER,
-"time format\0", 0x00000006L, MCI_INTEGER,
-"tint\0", 0x00004015L, MCI_INTEGER,
-"treble\0", 0x00004016L, MCI_INTEGER,
-"unsaved\0", 0x00004017L, MCI_INTEGER,
-"video key color\0", 0x00004025L, MCI_INTEGER,
-"video key index\0", 0x00004024L, MCI_INTEGER,
-"video source\0", 0x0000401bL, MCI_INTEGER,
-"video source number\0", 0x0000401eL, MCI_INTEGER,
-"video record\0", 0x0000401cL, MCI_INTEGER,
-"video stream\0", 0x0000402eL, MCI_INTEGER,
-"volume\0", 0x00004019L, MCI_INTEGER,
-"window handle\0", 0x00004001L, MCI_INTEGER,
-"window visible\0", 0x00004021L, MCI_INTEGER,
-"window minimized\0", 0x00004022L, MCI_INTEGER,
-"window maximized\0", 0x00004023L, MCI_INTEGER,
-"video streams\0", 0x00004100L, MCI_INTEGER,
-"video bitrate\0", 0x00004101L, MCI_INTEGER,
-"video maxbitrate\0", 0x00004102L, MCI_INTEGER,
-"audio streams\0", 0x00004103L, MCI_INTEGER,
-"audio bitrate\0", 0x00004104L, MCI_INTEGER,
-"video brush\0", 0x00004105L, MCI_INTEGER,
-"audio\0", 0x00004014L, MCI_INTEGER,
-"video\0", 0x00004018L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"track\0", 0x00000010L, MCI_INTEGER,
-"start\0", 0x00000200L, MCI_FLAG,
-"left\0", 0x00080000L, MCI_FLAG,
-"right\0", 0x00100000L, MCI_FLAG,
-"nominal\0", 0x00020000L, MCI_FLAG,
-"record\0", 0x01000000L, MCI_FLAG,
-"input\0", 0x00400000L, MCI_FLAG,
-"output\0", 0x00800000L, MCI_FLAG,
-"disk space\0", 0x00200000L, MCI_STRING,
-"reference\0", 0x00040000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"step\0", 0x0000080eL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"reverse\0", 0x00010000L, MCI_FLAG,
-"by\0", 0x00020000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"stop\0", 0x00000808L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"hold\0", 0x00010000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"undo\0", 0x00000879L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"unfreeze\0", 0x00000845L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"update\0", 0x00000854L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"hdc\0", 0x00020000L, MCI_INTEGER,
-"paint\0", 0x00040000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"where\0", 0x00000843L, MCI_COMMAND_HEAD,
-"\0", 0x00000007L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"source\0", 0x00020000L, MCI_FLAG,
-"destination\0", 0x00040000L, MCI_FLAG,
-"frame\0", 0x00080000L, MCI_FLAG,
-"video\0", 0x00100000L, MCI_FLAG,
-"window\0", 0x00200000L, MCI_FLAG,
-"max\0", 0x00400000L, MCI_FLAG,
-"min\0", 0x00800000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"window\0", 0x00000841L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"test\0", 0x00000020L, MCI_FLAG,
-"handle\0", 0x00010000L, MCI_CONSTANT,
-"default\0", 0x00000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"state\0", 0x00040000L, MCI_CONSTANT,
-"hide\0", 0x00000000L, MCI_INTEGER,
-"minimize\0", 0x00000006L, MCI_INTEGER,
-"restore\0", 0x00000009L, MCI_INTEGER,
-"show maximized\0", 0x00000003L, MCI_INTEGER,
-"show min noactive\0", 0x00000007L, MCI_INTEGER,
-"show minimized\0", 0x00000002L, MCI_INTEGER,
-"show na\0", 0x00000008L, MCI_INTEGER,
-"show noactivate\0", 0x00000004L, MCI_INTEGER,
-"show normal\0", 0x00000001L, MCI_INTEGER,
-"show\0", 0x00000005L, MCI_INTEGER,
-"no action\0", 0x00000008L, MCI_INTEGER,
-"minimized\0", 0x00000002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"text\0", 0x00080000L, MCI_STRING,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"\0", 0x00000000L, MCI_END_COMMAND_LIST
+L"play\0", 0x00000806L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"repeat\0", 0x00010000L, MCI_FLAG,
+L"reverse\0", 0x00020000L, MCI_FLAG,
+L"window\0", 0x01000000L, MCI_FLAG,
+L"fullscreen by 2\0", 0x04000000L, MCI_FLAG,
+L"fullscreen\0", 0x02000000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"can record\0", 0x00000001L, MCI_INTEGER,
+L"has audio\0", 0x00000002L, MCI_INTEGER,
+L"has video\0", 0x00000003L, MCI_INTEGER,
+L"uses files\0", 0x00000005L, MCI_INTEGER,
+L"compound device\0", 0x00000006L, MCI_INTEGER,
+L"device type\0", 0x00000004L, MCI_INTEGER,
+L"can eject\0", 0x00000007L, MCI_INTEGER,
+L"can play\0", 0x00000008L, MCI_INTEGER,
+L"can save\0", 0x00000009L, MCI_INTEGER,
+L"can lock\0", 0x00004000L, MCI_INTEGER,
+L"can reverse\0", 0x00004004L, MCI_INTEGER,
+L"can stretch input\0", 0x00004008L, MCI_INTEGER,
+L"can stretch\0", 0x00004001L, MCI_INTEGER,
+L"can test\0", 0x00004009L, MCI_INTEGER,
+L"has still\0", 0x00004005L, MCI_INTEGER,
+L"can freeze\0", 0x00004002L, MCI_INTEGER,
+L"uses palettes\0", 0x00004006L, MCI_INTEGER,
+L"windows\0", 0x00004003L, MCI_INTEGER,
+L"maximum play rate\0", 0x0000400aL, MCI_INTEGER,
+L"minimum play rate\0", 0x0000400bL, MCI_INTEGER,
+L"can colorkey\0", 0x00004100L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"capture\0", 0x00000870L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"as\0", 0x00010000L, MCI_STRING,
+L"at\0", 0x00020000L, MCI_RECT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"close\0", 0x00000804L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"configure\0", 0x0000087aL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"copy\0", 0x00000852L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"at\0", 0x00010000L, MCI_RECT,
+L"audio stream\0", 0x00020000L, MCI_INTEGER,
+L"video stream\0", 0x00040000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"cue\0", 0x00000830L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"input\0", 0x00010000L, MCI_FLAG,
+L"output\0", 0x00020000L, MCI_FLAG,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"noshow\0", 0x00040000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"cut\0", 0x00000851L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"at\0", 0x00010000L, MCI_RECT,
+L"audio stream\0", 0x00020000L, MCI_INTEGER,
+L"video stream\0", 0x00040000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"delete\0", 0x00000856L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"at\0", 0x00010000L, MCI_RECT,
+L"audio stream\0", 0x00020000L, MCI_INTEGER,
+L"video stream\0", 0x00040000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"freeze\0", 0x00000844L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"outside\0", 0x00020000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"file\0", 0x00000200L, MCI_FLAG,
+L"product\0", 0x00000100L, MCI_FLAG,
+L"window text\0", 0x00010000L, MCI_FLAG,
+L"usage\0", 0x00004000L, MCI_FLAG,
+L"version\0", 0x00000400L, MCI_FLAG,
+L"\0", 0x00020000L, MCI_CONSTANT,
+L"audio algorithm\0", 0x00004004L, MCI_INTEGER,
+L"audio quality\0", 0x00004001L, MCI_INTEGER,
+L"still algorithm\0", 0x00004005L, MCI_INTEGER,
+L"still quality\0", 0x00004002L, MCI_INTEGER,
+L"video algorithm\0", 0x00004006L, MCI_INTEGER,
+L"video quality\0", 0x00004003L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"list\0", 0x00000878L, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"count\0", 0x00020000L, MCI_FLAG,
+L"number\0", 0x00040000L, MCI_INTEGER,
+L"\0", 0x00010000L, MCI_CONSTANT,
+L"audio algorithm\0", 0x00004000L, MCI_INTEGER,
+L"audio quality\0", 0x00004001L, MCI_INTEGER,
+L"audio stream\0", 0x00004002L, MCI_INTEGER,
+L"still algorithm\0", 0x00004003L, MCI_INTEGER,
+L"still quality\0", 0x00004004L, MCI_INTEGER,
+L"video algorithm\0", 0x00004005L, MCI_INTEGER,
+L"video quality\0", 0x00004006L, MCI_INTEGER,
+L"video source\0", 0x00004008L, MCI_INTEGER,
+L"video stream\0", 0x00004007L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"algorithm\0", 0x00080000L, MCI_STRING,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"load\0", 0x00000850L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_STRING,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"monitor\0", 0x00000871L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00020000L, MCI_CONSTANT,
+L"input\0", 0x00004000L, MCI_INTEGER,
+L"file\0", 0x00004001L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"method\0", 0x00010000L, MCI_CONSTANT,
+L"pre\0", 0x0000a000L, MCI_INTEGER,
+L"post\0", 0x0000a001L, MCI_INTEGER,
+L"direct\0", 0x0000a002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"open\0", 0x00000803L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"type\0", 0x00002000L, MCI_STRING,
+L"element\0", 0x00000200L, MCI_STRING,
+L"alias\0", 0x00000400L, MCI_STRING,
+L"shareable\0", 0x00000100L, MCI_FLAG,
+L"style\0", 0x00010000L, MCI_CONSTANT,
+L"overlapped\0", 0x00cf0000L, MCI_INTEGER,
+L"popup\0", 0x80880000L, MCI_INTEGER,
+L"child\0", 0x40000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"parent\0", 0x00020000L, MCI_INTEGER,
+L"nostatic\0", 0x00040000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"paste\0", 0x00000853L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"at\0", 0x00010000L, MCI_RECT,
+L"insert\0", 0x00080000L, MCI_FLAG,
+L"overwrite\0", 0x00100000L, MCI_FLAG,
+L"audio stream\0", 0x00020000L, MCI_INTEGER,
+L"video stream\0", 0x00040000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"pause\0", 0x00000809L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"put\0", 0x00000842L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"source\0", 0x00020000L, MCI_FLAG,
+L"destination\0", 0x00040000L, MCI_FLAG,
+L"frame\0", 0x00080000L, MCI_FLAG,
+L"video\0", 0x00100000L, MCI_FLAG,
+L"window\0", 0x00200000L, MCI_FLAG,
+L"client\0", 0x00400000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"quality\0", 0x00000877L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00010000L, MCI_CONSTANT,
+L"audio\0", 0x00004000L, MCI_INTEGER,
+L"still\0", 0x00004001L, MCI_INTEGER,
+L"video\0", 0x00004002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"name\0", 0x00020000L, MCI_STRING,
+L"algorithm\0", 0x00040000L, MCI_STRING,
+L"dialog\0", 0x00080000L, MCI_FLAG,
+L"handle\0", 0x00100000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"realize\0", 0x00000840L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"normal\0", 0x00010000L, MCI_FLAG,
+L"background\0", 0x00020000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"record\0", 0x0000080fL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"insert\0", 0x00000100L, MCI_FLAG,
+L"overwrite\0", 0x00000200L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"hold\0", 0x00020000L, MCI_FLAG,
+L"audio stream\0", 0x00040000L, MCI_INTEGER,
+L"video stream\0", 0x00080000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"reserve\0", 0x00000872L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"in\0", 0x00010000L, MCI_STRING,
+L"size\0", 0x00020000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"restore\0", 0x0000087bL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"from\0", 0x00010000L, MCI_STRING,
+L"at\0", 0x00020000L, MCI_RECT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"resume\0", 0x00000855L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"save\0", 0x00000813L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_STRING,
+L"at\0", 0x00010000L, MCI_RECT,
+L"abort\0", 0x00020000L, MCI_FLAG,
+L"keepreserve\0", 0x00040000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"seek\0", 0x00000807L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"to start\0", 0x00000100L, MCI_FLAG,
+L"to end\0", 0x00000200L, MCI_FLAG,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"time format\0", 0x00000400L, MCI_CONSTANT,
+L"frames\0", 0x00000003L, MCI_INTEGER,
+L"milliseconds\0", 0x00000000L, MCI_INTEGER,
+L"ms\0", 0x00000000L, MCI_INTEGER,
+L"bytes\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"door open\0", 0x00000100L, MCI_FLAG,
+L"door closed\0", 0x00000200L, MCI_FLAG,
+L"audio\0", 0x00000800L, MCI_CONSTANT,
+L"all\0", 0x00000000L, MCI_INTEGER,
+L"left\0", 0x00000001L, MCI_INTEGER,
+L"right\0", 0x00000002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"video\0", 0x00001000L, MCI_FLAG,
+L"seek exactly\0", 0x00010000L, MCI_FLAG,
+L"file format\0", 0x00080000L, MCI_CONSTANT,
+L"avss\0", 0x00004000L, MCI_INTEGER,
+L"avi\0", 0x00004001L, MCI_INTEGER,
+L"dib\0", 0x00004002L, MCI_INTEGER,
+L"rdib\0", 0x00004003L, MCI_INTEGER,
+L"jpeg\0", 0x00004004L, MCI_INTEGER,
+L"rjpeg\0", 0x00004005L, MCI_INTEGER,
+L"jfif\0", 0x00004006L, MCI_INTEGER,
+L"mpeg\0", 0x00004007L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"still\0", 0x00040000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"speed\0", 0x00020000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"setaudio\0", 0x00000873L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00800000L, MCI_CONSTANT,
+L"bass\0", 0x00004001L, MCI_INTEGER,
+L"treble\0", 0x00004000L, MCI_INTEGER,
+L"volume\0", 0x00004002L, MCI_INTEGER,
+L"stream\0", 0x00004003L, MCI_INTEGER,
+L"source\0", 0x00004004L, MCI_INTEGER,
+L"samplespersec\0", 0x00004005L, MCI_INTEGER,
+L"bytespersec\0", 0x00004006L, MCI_INTEGER,
+L"alignment\0", 0x00004007L, MCI_INTEGER,
+L"bitspersample\0", 0x00004008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"to\0", 0x01000000L, MCI_CONSTANT,
+L"left\0", 0x00000001L, MCI_INTEGER,
+L"right\0", 0x00000002L, MCI_INTEGER,
+L"average\0", 0x00004000L, MCI_INTEGER,
+L"stereo\0", 0x00000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"over\0", 0x00010000L, MCI_INTEGER,
+L"algorithm\0", 0x00040000L, MCI_STRING,
+L"quality\0", 0x00080000L, MCI_STRING,
+L"record\0", 0x00100000L, MCI_FLAG,
+L"left\0", 0x00200000L, MCI_FLAG,
+L"clocktime\0", 0x00020000L, MCI_FLAG,
+L"right\0", 0x00400000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"input\0", 0x02000000L, MCI_FLAG,
+L"output\0", 0x04000000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"setvideo\0", 0x00000876L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00100000L, MCI_CONSTANT,
+L"frame rate\0", 0x00004008L, MCI_INTEGER,
+L"brightness\0", 0x00004000L, MCI_INTEGER,
+L"color\0", 0x00004001L, MCI_INTEGER,
+L"contrast\0", 0x00004002L, MCI_INTEGER,
+L"tint\0", 0x00004003L, MCI_INTEGER,
+L"sharpness\0", 0x00004004L, MCI_INTEGER,
+L"gamma\0", 0x00004005L, MCI_INTEGER,
+L"palette handle\0", 0x00004007L, MCI_INTEGER,
+L"stream\0", 0x00004006L, MCI_INTEGER,
+L"source\0", 0x00004009L, MCI_INTEGER,
+L"key index\0", 0x0000400aL, MCI_INTEGER,
+L"key color\0", 0x0000400bL, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"to\0", 0x01000000L, MCI_CONSTANT,
+L"ntsc\0", 0x00004000L, MCI_INTEGER,
+L"rgb\0", 0x00004001L, MCI_INTEGER,
+L"svideo\0", 0x00004002L, MCI_INTEGER,
+L"pal\0", 0x00004003L, MCI_INTEGER,
+L"secam\0", 0x00004004L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"quality\0", 0x00010000L, MCI_STRING,
+L"algorithm\0", 0x00020000L, MCI_STRING,
+L"number\0", 0x00080000L, MCI_INTEGER,
+L"over\0", 0x00200000L, MCI_INTEGER,
+L"record\0", 0x00400000L, MCI_FLAG,
+L"still\0", 0x00800000L, MCI_FLAG,
+L"clocktime\0", 0x00040000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"input\0", 0x02000000L, MCI_FLAG,
+L"output\0", 0x04000000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"signal\0", 0x00000875L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_INTEGER,
+L"every\0", 0x00020000L, MCI_INTEGER,
+L"uservalue\0", 0x00040000L, MCI_INTEGER,
+L"cancel\0", 0x00080000L, MCI_FLAG,
+L"return position\0", 0x00100000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"status\0", 0x00000814L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"frames skipped\0", 0x00008001L, MCI_INTEGER,
+L"play speed\0", 0x00008002L, MCI_INTEGER,
+L"audio breaks\0", 0x00008003L, MCI_INTEGER,
+L"alignment\0", 0x00004029L, MCI_INTEGER,
+L"audio input\0", 0x00004000L, MCI_INTEGER,
+L"audio record\0", 0x0000401aL, MCI_INTEGER,
+L"audio source\0", 0x00004009L, MCI_INTEGER,
+L"audio stream\0", 0x0000402dL, MCI_INTEGER,
+L"bass\0", 0x0000400fL, MCI_INTEGER,
+L"bitsperpel\0", 0x0000402bL, MCI_INTEGER,
+L"bitspersample\0", 0x0000402aL, MCI_INTEGER,
+L"brightness\0", 0x00004005L, MCI_INTEGER,
+L"bytespersec\0", 0x00004028L, MCI_INTEGER,
+L"color\0", 0x00004006L, MCI_INTEGER,
+L"contrast\0", 0x00004007L, MCI_INTEGER,
+L"current track\0", 0x00000008L, MCI_INTEGER,
+L"file format\0", 0x00004008L, MCI_INTEGER,
+L"still file format\0", 0x0000401dL, MCI_INTEGER,
+L"file mode\0", 0x0000401fL, MCI_INTEGER,
+L"file completion\0", 0x00004020L, MCI_INTEGER,
+L"forward\0", 0x0000402cL, MCI_INTEGER,
+L"gamma\0", 0x0000400aL, MCI_INTEGER,
+L"length\0", 0x00000001L, MCI_INTEGER,
+L"media present\0", 0x00000005L, MCI_INTEGER,
+L"mode\0", 0x00000004L, MCI_INTEGER,
+L"monitor method\0", 0x0000400cL, MCI_INTEGER,
+L"monitor\0", 0x0000400bL, MCI_INTEGER,
+L"number of tracks\0", 0x00000003L, MCI_INTEGER,
+L"palette handle\0", 0x00004004L, MCI_INTEGER,
+L"pause mode\0", 0x00004026L, MCI_INTEGER,
+L"position\0", 0x00000002L, MCI_INTEGER,
+L"ready\0", 0x00000007L, MCI_INTEGER,
+L"frame rate\0", 0x0000400eL, MCI_INTEGER,
+L"reserved size\0", 0x00004010L, MCI_INTEGER,
+L"samplespersec\0", 0x00004027L, MCI_INTEGER,
+L"seek exactly\0", 0x00004011L, MCI_INTEGER,
+L"sharpness\0", 0x00004012L, MCI_INTEGER,
+L"smpte\0", 0x00004013L, MCI_INTEGER,
+L"speed\0", 0x00004003L, MCI_INTEGER,
+L"time format\0", 0x00000006L, MCI_INTEGER,
+L"tint\0", 0x00004015L, MCI_INTEGER,
+L"treble\0", 0x00004016L, MCI_INTEGER,
+L"unsaved\0", 0x00004017L, MCI_INTEGER,
+L"video key color\0", 0x00004025L, MCI_INTEGER,
+L"video key index\0", 0x00004024L, MCI_INTEGER,
+L"video source\0", 0x0000401bL, MCI_INTEGER,
+L"video source number\0", 0x0000401eL, MCI_INTEGER,
+L"video record\0", 0x0000401cL, MCI_INTEGER,
+L"video stream\0", 0x0000402eL, MCI_INTEGER,
+L"volume\0", 0x00004019L, MCI_INTEGER,
+L"window handle\0", 0x00004001L, MCI_INTEGER,
+L"window visible\0", 0x00004021L, MCI_INTEGER,
+L"window minimized\0", 0x00004022L, MCI_INTEGER,
+L"window maximized\0", 0x00004023L, MCI_INTEGER,
+L"video streams\0", 0x00004100L, MCI_INTEGER,
+L"video bitrate\0", 0x00004101L, MCI_INTEGER,
+L"video maxbitrate\0", 0x00004102L, MCI_INTEGER,
+L"audio streams\0", 0x00004103L, MCI_INTEGER,
+L"audio bitrate\0", 0x00004104L, MCI_INTEGER,
+L"video brush\0", 0x00004105L, MCI_INTEGER,
+L"audio\0", 0x00004014L, MCI_INTEGER,
+L"video\0", 0x00004018L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"track\0", 0x00000010L, MCI_INTEGER,
+L"start\0", 0x00000200L, MCI_FLAG,
+L"left\0", 0x00080000L, MCI_FLAG,
+L"right\0", 0x00100000L, MCI_FLAG,
+L"nominal\0", 0x00020000L, MCI_FLAG,
+L"record\0", 0x01000000L, MCI_FLAG,
+L"input\0", 0x00400000L, MCI_FLAG,
+L"output\0", 0x00800000L, MCI_FLAG,
+L"disk space\0", 0x00200000L, MCI_STRING,
+L"reference\0", 0x00040000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"step\0", 0x0000080eL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"reverse\0", 0x00010000L, MCI_FLAG,
+L"by\0", 0x00020000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"stop\0", 0x00000808L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"hold\0", 0x00010000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"undo\0", 0x00000879L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"unfreeze\0", 0x00000845L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"update\0", 0x00000854L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"hdc\0", 0x00020000L, MCI_INTEGER,
+L"paint\0", 0x00040000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"where\0", 0x00000843L, MCI_COMMAND_HEAD,
+L"\0", 0x00000007L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"source\0", 0x00020000L, MCI_FLAG,
+L"destination\0", 0x00040000L, MCI_FLAG,
+L"frame\0", 0x00080000L, MCI_FLAG,
+L"video\0", 0x00100000L, MCI_FLAG,
+L"window\0", 0x00200000L, MCI_FLAG,
+L"max\0", 0x00400000L, MCI_FLAG,
+L"min\0", 0x00800000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"window\0", 0x00000841L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"test\0", 0x00000020L, MCI_FLAG,
+L"handle\0", 0x00010000L, MCI_CONSTANT,
+L"default\0", 0x00000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"state\0", 0x00040000L, MCI_CONSTANT,
+L"hide\0", 0x00000000L, MCI_INTEGER,
+L"minimize\0", 0x00000006L, MCI_INTEGER,
+L"restore\0", 0x00000009L, MCI_INTEGER,
+L"show maximized\0", 0x00000003L, MCI_INTEGER,
+L"show min noactive\0", 0x00000007L, MCI_INTEGER,
+L"show minimized\0", 0x00000002L, MCI_INTEGER,
+L"show na\0", 0x00000008L, MCI_INTEGER,
+L"show noactivate\0", 0x00000004L, MCI_INTEGER,
+L"show normal\0", 0x00000001L, MCI_INTEGER,
+L"show\0", 0x00000005L, MCI_INTEGER,
+L"no action\0", 0x00000008L, MCI_INTEGER,
+L"minimized\0", 0x00000002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"text\0", 0x00080000L, MCI_STRING,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"\0", 0x00000000L, MCI_END_COMMAND_LIST
 END
diff --git a/dlls/winmm/mciavi/private_mciavi.h b/dlls/winmm/mciavi/private_mciavi.h
index afdcc7f..1241c4b 100644
--- a/dlls/winmm/mciavi/private_mciavi.h
+++ b/dlls/winmm/mciavi/private_mciavi.h
@@ -41,12 +41,12 @@
 };
 
 typedef struct {
-    MCIDEVICEID                wDevID;
+    MCIDEVICEID         wDevID;
     int			nUseCount;          	/* Incremented for each shared open          */
     BOOL  		fShareable;         	/* TRUE if first open was shareable 	     */
     WORD		wCommandTable;		/* custom MCI command table */
-    DWORD              dwStatus;               /* One of MCI_MODE_XXX                       */
-    LPSTR              lpFileName;
+    DWORD               dwStatus;               /* One of MCI_MODE_XXX                       */
+    LPWSTR              lpFileName;
     DWORD		dwMciTimeFormat;	/* current time format */
     DWORD		dwSet;			/* what's turned on: video & audio l&r */
     /* information on the loaded AVI file */
@@ -90,9 +90,9 @@
 DWORD 	MCIAVI_ConvertFrameToTimeFormat(WINE_MCIAVI* wma, DWORD val, LPDWORD lpRet);
 DWORD 	MCIAVI_ConvertTimeFormatToFrame(WINE_MCIAVI* wma, DWORD val);
 DWORD	MCIAVI_mciGetDevCaps(UINT wDevID, DWORD dwFlags,  LPMCI_GETDEVCAPS_PARMS lpParms);
-DWORD	MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSA lpParms);
+DWORD	MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSW lpParms);
 DWORD	MCIAVI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpParms);
-DWORD	MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSA lpParms);
+DWORD	MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpParms);
 
 /* mmoutput.c */
 BOOL	MCIAVI_GetInfo(WINE_MCIAVI* wma);
@@ -108,9 +108,9 @@
 /* wnd.c */
 BOOL    MCIAVI_RegisterClass(void);
 BOOL    MCIAVI_UnregisterClass(void);
-BOOL    MCIAVI_CreateWindow(WINE_MCIAVI* wma, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSA lpOpenParms);
+BOOL    MCIAVI_CreateWindow(WINE_MCIAVI* wma, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSW lpOpenParms);
 DWORD	MCIAVI_mciPut(UINT wDevID, DWORD dwFlags, LPMCI_DGV_PUT_PARMS lpParms);
 DWORD	MCIAVI_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms);
-DWORD	MCIAVI_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSA lpParms);
+DWORD	MCIAVI_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSW lpParms);
 
 #endif  /* __WINE_PRIVATE_MCIAVI_H */
diff --git a/dlls/winmm/mciavi/wnd.c b/dlls/winmm/mciavi/wnd.c
index 8b24730..639f057 100644
--- a/dlls/winmm/mciavi/wnd.c
+++ b/dlls/winmm/mciavi/wnd.c
@@ -85,7 +85,6 @@
     default:
         return DefWindowProcW(hWnd, uMsg, wParam, lParam);
     }
-    return 0;
 }
 
 BOOL MCIAVI_UnregisterClass(void)
@@ -112,13 +111,13 @@
     return FALSE;
 }
 
-BOOL    MCIAVI_CreateWindow(WINE_MCIAVI* wma, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSA lpOpenParms)
+BOOL    MCIAVI_CreateWindow(WINE_MCIAVI* wma, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSW lpOpenParms)
 {
     static const WCHAR captionW[] = {'W','i','n','e',' ','M','C','I','-','A','V','I',' ','p','l','a','y','e','r',0};
     HWND	hParent = 0;
     DWORD	dwStyle = WS_OVERLAPPEDWINDOW;
     int		p = CW_USEDEFAULT;
-    RECT rc;
+    RECT        rc;
 
     /* what should be done ? */
     if (wma->hWnd) return TRUE;
@@ -134,9 +133,9 @@
     AdjustWindowRect(&rc, dwStyle, FALSE);
 
     wma->hWnd = CreateWindowW(mciaviW, captionW,
-                             dwStyle, rc.left, rc.top,
-                             rc.right, rc.bottom,
-                             hParent, 0, MCIAVI_hInstance,
+                              dwStyle, rc.left, rc.top,
+                              rc.right, rc.bottom,
+                              hParent, 0, MCIAVI_hInstance,
                               (LPVOID)wma->wDevID);
     wma->hWndPaint = wma->hWnd;
     return (BOOL)wma->hWnd;
@@ -264,7 +263,7 @@
 /***************************************************************************
  * 				MCIAVI_mciWindow			[internal]
  */
-DWORD	MCIAVI_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSA lpParms)
+DWORD	MCIAVI_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSW lpParms)
 {
     WINE_MCIAVI*	wma = MCIAVI_mciGetOpenDev(wDevID);
 
@@ -288,8 +287,8 @@
         ShowWindow(wma->hWndPaint, lpParms->nCmdShow);
     }
     if (dwFlags & MCI_DGV_WINDOW_TEXT) {
-	TRACE("Setting caption to '%s'\n", lpParms->lpstrText);
-       SetWindowTextA(wma->hWndPaint, lpParms->lpstrText);
+	TRACE("Setting caption to %s\n", debugstr_w(lpParms->lpstrText));
+        SetWindowTextW(wma->hWndPaint, lpParms->lpstrText);
     }
 
     LeaveCriticalSection(&wma->cs);
diff --git a/dlls/winmm/mcicda/Makefile.in b/dlls/winmm/mcicda/Makefile.in
index 72a2134..74d499b 100644
--- a/dlls/winmm/mcicda/Makefile.in
+++ b/dlls/winmm/mcicda/Makefile.in
@@ -4,6 +4,7 @@
 VPATH     = @srcdir@
 MODULE    = mcicda.drv
 IMPORTS   = winmm user32 kernel32
+EXTRALIBS = $(LIBUNICODE)
 
 C_SRCS = \
 	mcicda.c
diff --git a/dlls/winmm/mcicda/mcicda.c b/dlls/winmm/mcicda/mcicda.c
index 3c3570f..0b0fa0a 100644
--- a/dlls/winmm/mcicda/mcicda.c
+++ b/dlls/winmm/mcicda/mcicda.c
@@ -37,6 +37,7 @@
 #include "ntddstor.h"
 #include "ntddcdrm.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mcicda);
 
@@ -60,13 +61,13 @@
 /**************************************************************************
  * 				MCICDA_drvOpen			[internal]
  */
-static	DWORD	MCICDA_drvOpen(LPSTR str, LPMCI_OPEN_DRIVER_PARMSA modp)
+static	DWORD	MCICDA_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
 {
     WINE_MCICDAUDIO*	wmcda;
 
     if (!modp) return 0xFFFFFFFF;
 
-    wmcda = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,  sizeof(WINE_MCICDAUDIO));
+    wmcda = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCICDAUDIO));
 
     if (!wmcda)
 	return 0;
@@ -264,14 +265,13 @@
 /**************************************************************************
  * 				MCICDA_Open			[internal]
  */
-static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSA lpOpenParms)
+static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms)
 {
     DWORD		dwDeviceID;
     DWORD               ret = MCIERR_HARDWARE;
     WINE_MCICDAUDIO* 	wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(wDevID);
-    char                root[7];
+    WCHAR               root[7], drive = 0;
     int                 count;
-    char                drive = 0;
 
     TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpOpenParms);
 
@@ -297,18 +297,18 @@
             WARN("MCI_OPEN_ELEMENT_ID %8lx ! Abort\n", (DWORD)lpOpenParms->lpstrElementName);
             return MCIERR_NO_ELEMENT_ALLOWED;
         }
-        TRACE("MCI_OPEN_ELEMENT element name: %s\n", debugstr_a(lpOpenParms->lpstrElementName));
+        TRACE("MCI_OPEN_ELEMENT element name: %s\n", debugstr_w(lpOpenParms->lpstrElementName));
         if (!isalpha(lpOpenParms->lpstrElementName[0]) || lpOpenParms->lpstrElementName[1] != ':' ||
             (lpOpenParms->lpstrElementName[2] && lpOpenParms->lpstrElementName[2] != '\\'))
         {
-            WARN("MCI_OPEN_ELEMENT unsupported format: %s\n", lpOpenParms->lpstrElementName);
+            WARN("MCI_OPEN_ELEMENT unsupported format: %s\n", 
+                 debugstr_w(lpOpenParms->lpstrElementName));
             ret = MCIERR_NO_ELEMENT_ALLOWED;
             goto the_error;
         }
         drive = toupper(lpOpenParms->lpstrElementName[0]);
-        strcpy(root, "A:\\");
-        root[0] = drive;
-        if (GetDriveTypeA(root) != DRIVE_CDROM)
+        root[0] = drive; root[1] = ':'; root[2] = '\\'; root[3] = '\0';
+        if (GetDriveTypeW(root) != DRIVE_CDROM)
         {
             ret = MCIERR_INVALID_DEVICE_NAME;
             goto the_error;
@@ -317,10 +317,10 @@
     else
     {
         /* drive letter isn't passed... get the dwDeviceID'th cdrom in the system */
-        strcpy(root, "A:\\");
+        root[0] = 'A'; root[1] = ':'; root[2] = '\\'; root[3] = '\0';
         for (count = 0; root[0] <= 'Z'; root[0]++)
         {
-            if (GetDriveTypeA(root) == DRIVE_CDROM && ++count >= dwDeviceID)
+            if (GetDriveTypeW(root) == DRIVE_CDROM && ++count >= dwDeviceID)
             {
                 drive = root[0];
                 break;
@@ -337,9 +337,8 @@
     wmcda->dwTimeFormat = MCI_FORMAT_MSF;
 
     /* now, open the handle */
-    strcpy(root, "\\\\.\\A:");
-    root[4] = drive;
-    wmcda->handle = CreateFileA(root, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
+    root[0] = root[1] = '\\'; root[2] = '.'; root[3] = '\\'; root[4] = drive; root[5] = ':'; root[6] = '\0';
+    wmcda->handle = CreateFileW(root, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
     if (wmcda->handle != INVALID_HANDLE_VALUE)
         return 0;
 
@@ -462,12 +461,12 @@
 /**************************************************************************
  * 				MCICDA_Info			[internal]
  */
-static DWORD MCICDA_Info(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSA lpParms)
+static DWORD MCICDA_Info(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)
 {
-    LPCSTR		str = NULL;
+    LPCWSTR		str = NULL;
     WINE_MCICDAUDIO*	wmcda = MCICDA_GetOpenDrv(wDevID);
     DWORD		ret = 0;
-    char		buffer[16];
+    WCHAR		buffer[16];
 
     TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 
@@ -478,13 +477,15 @@
     TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
 
     if (dwFlags & MCI_INFO_PRODUCT) {
-	str = "Wine's audio CD";
+        static const WCHAR wszAudioCd[] = {'W','i','n','e','\'','s',' ','a','u','d','i','o',' ','C','D',0};
+        str = wszAudioCd;
     } else if (dwFlags & MCI_INFO_MEDIA_UPC) {
 	ret = MCIERR_NO_IDENTITY;
     } else if (dwFlags & MCI_INFO_MEDIA_IDENTITY) {
 	DWORD	    res = 0;
         CDROM_TOC   toc;
         DWORD       br;
+	static const WCHAR wszLu[] = {'%','l','u',0};
 
         if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0,
                              &toc, sizeof(toc), &br, NULL)) {
@@ -492,23 +493,23 @@
 	}
 
 	res = CDROM_Audio_GetSerial(&toc);
-	sprintf(buffer, "%lu", res);
+	sprintfW(buffer, wszLu, res);
 	str = buffer;
     } else {
 	WARN("Don't know this info command (%lu)\n", dwFlags);
 	ret = MCIERR_UNRECOGNIZED_COMMAND;
     }
     if (str) {
-	if (lpParms->dwRetSize <= strlen(str)) {
-	    lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1);
+	if (lpParms->dwRetSize <= strlenW(str)) {
+	    lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1);
 	    ret = MCIERR_PARAM_OVERFLOW;
 	} else {
-	    strcpy(lpParms->lpstrReturn, str);
+	    strcpyW(lpParms->lpstrReturn, str);
 	}
     } else {
 	*lpParms->lpstrReturn = 0;
     }
-    TRACE("=> %s (%ld)\n", lpParms->lpstrReturn, ret);
+    TRACE("=> %s (%ld)\n", debugstr_w(lpParms->lpstrReturn), ret);
     return ret;
 }
 
@@ -992,7 +993,7 @@
     switch(wMsg) {
     case DRV_LOAD:		return 1;
     case DRV_FREE:		return 1;
-    case DRV_OPEN:		return MCICDA_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2);
+    case DRV_OPEN:		return MCICDA_drvOpen((LPCWSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSW)dwParam2);
     case DRV_CLOSE:		return MCICDA_drvClose(dwDevID);
     case DRV_ENABLE:		return 1;
     case DRV_DISABLE:		return 1;
@@ -1005,10 +1006,10 @@
     if (dwDevID == 0xFFFFFFFF) return MCIERR_UNSUPPORTED_FUNCTION;
 
     switch (wMsg) {
-    case MCI_OPEN_DRIVER:	return MCICDA_Open(dwDevID, dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
+    case MCI_OPEN_DRIVER:	return MCICDA_Open(dwDevID, dwParam1, (LPMCI_OPEN_PARMSW)dwParam2);
     case MCI_CLOSE_DRIVER:	return MCICDA_Close(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
     case MCI_GETDEVCAPS:	return MCICDA_GetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
-    case MCI_INFO:		return MCICDA_Info(dwDevID, dwParam1, (LPMCI_INFO_PARMSA)dwParam2);
+    case MCI_INFO:		return MCICDA_Info(dwDevID, dwParam1, (LPMCI_INFO_PARMSW)dwParam2);
     case MCI_STATUS:		return MCICDA_Status(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);
     case MCI_SET:		return MCICDA_Set(dwDevID, dwParam1, (LPMCI_SET_PARMS)dwParam2);
     case MCI_PLAY:		return MCICDA_Play(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);
diff --git a/dlls/winmm/mciseq/mcimidi.c b/dlls/winmm/mciseq/mcimidi.c
index 99c6406..22f26f7 100644
--- a/dlls/winmm/mciseq/mcimidi.c
+++ b/dlls/winmm/mciseq/mcimidi.c
@@ -48,6 +48,7 @@
 #include "wownt32.h"
 #include "mmddk.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mcimidi);
 
@@ -74,9 +75,9 @@
     WORD		wNotifyDeviceID;    	/* MCI device ID with a pending notification */
     HANDLE 		hCallback;         	/* Callback handle for pending notification  */
     HMMIO		hFile;	            	/* mmio file handle open as Element          */
-    LPSTR		lpstrElementName;       /* Name of file (if any)                     */
-    LPSTR		lpstrCopyright;
-    LPSTR		lpstrName;
+    LPWSTR		lpstrElementName;       /* Name of file (if any)                     */
+    LPWSTR		lpstrCopyright;
+    LPWSTR		lpstrName;
     WORD		dwStatus;		/* one from MCI_MODE_xxxx */
     DWORD		dwMciTimeFormat;	/* One of the supported MCI_FORMAT_xxxx */
     WORD		wFormat;		/* Format of MIDI hFile (0, 1 or 2) */
@@ -171,7 +172,7 @@
 /**************************************************************************
  * 				MIDI_drvOpen			[internal]
  */
-static	DWORD	MIDI_drvOpen(LPSTR str, LPMCI_OPEN_DRIVER_PARMSA modp)
+static	DWORD	MIDI_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
 {
     WINE_MCIMIDI*	wmm;
 
@@ -416,18 +417,20 @@
 		switch (HIBYTE(LOWORD(mmt->dwEventData))) {
 		case 0x02:
 		    if (wmm->lpstrCopyright) {
-			WARN("Two copyright notices (%s|%s)\n", wmm->lpstrCopyright, buf);
+			WARN("Two copyright notices (%s|%s)\n", debugstr_w(wmm->lpstrCopyright), buf);
 		    } else {
-                        wmm->lpstrCopyright = HeapAlloc( GetProcessHeap(), 0, strlen(buf)+1 );
-                        strcpy( wmm->lpstrCopyright, buf );
+                        len = MultiByteToWideChar( CP_ACP, 0, buf, -1, NULL, 0 );
+                        wmm->lpstrCopyright = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+                        len = MultiByteToWideChar( CP_ACP, 0, buf, -1, wmm->lpstrCopyright, len );
 		    }
 		    break;
 		case 0x03:
 		    if (wmm->lpstrName) {
-			WARN("Two names (%s|%s)\n", wmm->lpstrName, buf);
+			WARN("Two names (%s|%s)\n", debugstr_w(wmm->lpstrName), buf);
 		    } else {
-			wmm->lpstrName = HeapAlloc( GetProcessHeap(), 0, strlen(buf)+1 );
-                        strcpy( wmm->lpstrName, buf );
+                        len = MultiByteToWideChar( CP_ACP, 0, buf, -1, NULL, 0 );
+                        wmm->lpstrName = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+                        len = MultiByteToWideChar( CP_ACP, 0, buf, -1, wmm->lpstrName, len );
 		    }
 		    break;
 		}
@@ -712,7 +715,7 @@
 /**************************************************************************
  * 				MIDI_mciOpen			[internal]
  */
-static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSA lpParms)
+static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms)
 {
     DWORD		dwRet = 0;
     DWORD		dwDeviceID;
@@ -742,17 +745,18 @@
     /*	lpParms->wDeviceID = wDevID;*/
 
     if (dwFlags & MCI_OPEN_ELEMENT) {
-	TRACE("MCI_OPEN_ELEMENT '%s' !\n", lpParms->lpstrElementName);
-	if (lpParms->lpstrElementName && strlen(lpParms->lpstrElementName) > 0) {
-	    wmm->hFile = mmioOpenA(lpParms->lpstrElementName, NULL,
+	TRACE("MCI_OPEN_ELEMENT %s!\n", debugstr_w(lpParms->lpstrElementName));
+	if (lpParms->lpstrElementName && strlenW(lpParms->lpstrElementName) > 0) {
+	    wmm->hFile = mmioOpenW(lpParms->lpstrElementName, NULL,
 				   MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
 	    if (wmm->hFile == 0) {
-		WARN("Can't find file '%s' !\n", lpParms->lpstrElementName);
+		WARN("Can't find file %s!\n", debugstr_w(lpParms->lpstrElementName));
 		wmm->nUseCount--;
 		return MCIERR_FILE_NOT_FOUND;
 	    }
-            wmm->lpstrElementName = HeapAlloc(GetProcessHeap(), 0, strlen(lpParms->lpstrElementName) + 1);
-            strcpy(wmm->lpstrElementName, lpParms->lpstrElementName);
+            wmm->lpstrElementName = HeapAlloc(GetProcessHeap(), 0, 
+                                              (strlenW(lpParms->lpstrElementName) + 1) * sizeof(WCHAR));
+            strcpyW(wmm->lpstrElementName, lpParms->lpstrElementName);
 	}
     }
     TRACE("hFile=%p\n", wmm->hFile);
@@ -868,7 +872,7 @@
 	    TRACE("hFile closed !\n");
 	}
 	HeapFree(GetProcessHeap(), 0, wmm->tracks);
-	HeapFree(GetProcessHeap(), 0, (LPSTR)wmm->lpstrElementName);
+	HeapFree(GetProcessHeap(), 0, (LPWSTR)wmm->lpstrElementName);
 	HeapFree(GetProcessHeap(), 0, (LPSTR)wmm->lpstrCopyright);
 	HeapFree(GetProcessHeap(), 0, (LPSTR)wmm->lpstrName);
     } else {
@@ -925,7 +929,7 @@
     if (wmm == NULL)	return MCIERR_INVALID_DEVICE_ID;
 
     if (wmm->hFile == 0) {
-	WARN("Can't play: no file '%s' !\n", debugstr_a(wmm->lpstrElementName));
+	WARN("Can't play: no file %s!\n", debugstr_w(wmm->lpstrElementName));
 	return MCIERR_FILE_NOT_FOUND;
     }
 
@@ -1141,7 +1145,7 @@
 		    if (sf >= 0x80) 	TRACE("%d flats\n", -(char)sf);
 		    else if (sf > 0) 	TRACE("%d sharps\n", (char)sf);
 		    else 		TRACE("Key of C\n");
-		    TRACE("Mode: %s\n", (mm = 0) ? "major" : "minor");
+		    TRACE("Mode: %s\n", (mm == 0) ? "major" : "minor");
 		}
 		break;
 	    default:
@@ -1203,7 +1207,7 @@
     if (wmm == 0)	return MCIERR_INVALID_DEVICE_ID;
 
     if (wmm->hFile == 0) {
-	WARN("Can't find file='%s' !\n", debugstr_a(wmm->lpstrElementName));
+	WARN("Can't find file=%s!\n", debugstr_w(wmm->lpstrElementName));
 	return MCIERR_FILE_NOT_FOUND;
     }
     start = 1; 		end = 99999;
@@ -1356,12 +1360,13 @@
 	    return MCIERR_BAD_INTEGER;
 	}
 
-	if (lpParms->dwAudio & MCI_SET_AUDIO_ALL)
-	    TRACE("MCI_SET_AUDIO_ALL !\n");
-	if (lpParms->dwAudio & MCI_SET_AUDIO_LEFT)
-	    TRACE("MCI_SET_AUDIO_LEFT !\n");
-	if (lpParms->dwAudio & MCI_SET_AUDIO_RIGHT)
-	    TRACE("MCI_SET_AUDIO_RIGHT !\n");
+	switch (lpParms->dwAudio)
+        {
+        case MCI_SET_AUDIO_ALL:         TRACE("MCI_SET_AUDIO_ALL !\n"); break;
+        case MCI_SET_AUDIO_LEFT:        TRACE("MCI_SET_AUDIO_LEFT !\n"); break;
+        case MCI_SET_AUDIO_RIGHT:       TRACE("MCI_SET_AUDIO_RIGHT !\n"); break;
+        default:                        WARN("Unknown audio channel %lu\n", lpParms->dwAudio); break;
+        }
     }
 
     if (dwFlags & MCI_SEQ_SET_MASTER)
@@ -1568,11 +1573,12 @@
 /**************************************************************************
  * 				MIDI_mciInfo			[internal]
  */
-static DWORD MIDI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSA lpParms)
+static DWORD MIDI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)
 {
-    LPCSTR		str = 0;
+    LPCWSTR		str = 0;
     WINE_MCIMIDI*	wmm = MIDI_mciGetOpenDev(wDevID);
     DWORD		ret = 0;
+    static const WCHAR wszMidiSeq[] = {'W','i','n','e','\'','s',' ','M','I','D','I',' ','s','e','q','u','e','n','c','e','r',0};
 
     TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 
@@ -1583,28 +1589,20 @@
     TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
 
     switch (dwFlags & ~(MCI_WAIT|MCI_NOTIFY)) {
-    case MCI_INFO_PRODUCT:
-	str = "Wine's MIDI sequencer";
-	break;
-    case MCI_INFO_FILE:
-	str = wmm->lpstrElementName;
-	break;
-    case MCI_INFO_COPYRIGHT:
-	str = wmm->lpstrCopyright;
-	break;
-    case MCI_INFO_NAME:
-	str = wmm->lpstrName;
-	break;
+    case MCI_INFO_PRODUCT:      str = wszMidiSeq; break;
+    case MCI_INFO_FILE:         str = wmm->lpstrElementName; break;
+    case MCI_INFO_COPYRIGHT:    str = wmm->lpstrCopyright; break;
+    case MCI_INFO_NAME:         str = wmm->lpstrName; break;
     default:
 	WARN("Don't know this info command (%lu)\n", dwFlags);
 	return MCIERR_UNRECOGNIZED_COMMAND;
     }
     if (str) {
-	if (lpParms->dwRetSize <= strlen(str)) {
-	    lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1);
+	if (lpParms->dwRetSize <= strlenW(str)) {
+	    lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1);
 	    ret = MCIERR_PARAM_OVERFLOW;
 	} else {
-	    strcpy(lpParms->lpstrReturn, str);
+	    strcpyW(lpParms->lpstrReturn, str);
 	}
     } else {
 	*lpParms->lpstrReturn = 0;
@@ -1670,14 +1668,14 @@
     case DRV_CONFIGURE:		MessageBoxA(0, "Sample Midi Driver !", "OSS Driver", MB_OK); return 1;
     case DRV_INSTALL:		return DRVCNF_RESTART;
     case DRV_REMOVE:		return DRVCNF_RESTART;
-    case DRV_OPEN:		return MIDI_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2);
+    case DRV_OPEN:		return MIDI_drvOpen((LPCWSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSW)dwParam2);
     case DRV_CLOSE:		return MIDI_drvClose(dwDevID);
     }
 
     if (dwDevID == 0xFFFFFFFF) return MCIERR_UNSUPPORTED_FUNCTION;
 
     switch (wMsg) {
-    case MCI_OPEN_DRIVER:	return MIDI_mciOpen      (dwDevID, dwParam1, (LPMCI_OPEN_PARMSA)     dwParam2);
+    case MCI_OPEN_DRIVER:	return MIDI_mciOpen      (dwDevID, dwParam1, (LPMCI_OPEN_PARMSW)     dwParam2);
     case MCI_CLOSE_DRIVER:	return MIDI_mciClose     (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)   dwParam2);
     case MCI_PLAY:		return MIDI_mciPlay      (dwDevID, dwParam1, (LPMCI_PLAY_PARMS)      dwParam2);
     case MCI_RECORD:		return MIDI_mciRecord    (dwDevID, dwParam1, (LPMCI_RECORD_PARMS)    dwParam2);
@@ -1687,7 +1685,7 @@
     case MCI_RESUME:		return MIDI_mciResume    (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)   dwParam2);
     case MCI_STATUS:		return MIDI_mciStatus    (dwDevID, dwParam1, (LPMCI_STATUS_PARMS)    dwParam2);
     case MCI_GETDEVCAPS:	return MIDI_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
-    case MCI_INFO:		return MIDI_mciInfo      (dwDevID, dwParam1, (LPMCI_INFO_PARMSA)     dwParam2);
+    case MCI_INFO:		return MIDI_mciInfo      (dwDevID, dwParam1, (LPMCI_INFO_PARMSW)     dwParam2);
     case MCI_SEEK:		return MIDI_mciSeek      (dwDevID, dwParam1, (LPMCI_SEEK_PARMS)      dwParam2);
     /* commands that should be supported */
     case MCI_LOAD:
diff --git a/dlls/winmm/mciwave/mciwave.c b/dlls/winmm/mciwave/mciwave.c
index b89f4c1..25492f9 100644
--- a/dlls/winmm/mciwave/mciwave.c
+++ b/dlls/winmm/mciwave/mciwave.c
@@ -32,6 +32,7 @@
 #include "wownt32.h"
 #include "digitalv.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mciwave);
 
@@ -41,7 +42,7 @@
     int				nUseCount;	/* Incremented for each shared open */
     BOOL			fShareable;	/* TRUE if first open was shareable */
     HMMIO			hFile;		/* mmio file handle open as Element */
-    MCI_WAVE_OPEN_PARMSA 	openParms;
+    MCI_WAVE_OPEN_PARMSW 	openParms;
     WAVEFORMATEX		wfxRef;
     LPWAVEFORMATEX		lpWaveFormat;
     BOOL			fInput;		/* FALSE = Output, TRUE = Input */
@@ -134,7 +135,7 @@
 /**************************************************************************
  * 				MCIWAVE_drvOpen			[internal]
  */
-static	DWORD	WAVE_drvOpen(LPSTR str, LPMCI_OPEN_DRIVER_PARMSA modp)
+static	DWORD	WAVE_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
 {
     WINE_MCIWAVE*	wmw;
 
@@ -344,11 +345,11 @@
 /**************************************************************************
  * 			WAVE_mciOpen	                        [internal]
  */
-static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMSA lpOpenParms)
+static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMSW lpOpenParms)
 {
     DWORD		dwRet = 0;
     WINE_MCIWAVE*	wmw = (WINE_MCIWAVE*)mciGetDriverData(wDevID);
-    CHAR*               pszTmpFileName = 0;
+    WCHAR*              pszTmpFileName = 0;
 
     TRACE("(%04X, %08lX, %p)\n", wDevID, dwFlags, lpOpenParms);
     if (lpOpenParms == NULL)	return MCIERR_NULL_PARAMETER_BLOCK;
@@ -379,18 +380,18 @@
 	     */
 	    dwRet = MCIERR_UNRECOGNIZED_COMMAND;
 	} else {
-	    if (strlen(lpOpenParms->lpstrElementName) > 0) {
+	    if (strlenW(lpOpenParms->lpstrElementName) > 0) {
 	        lpOpenParms->lpstrElementName = lpOpenParms->lpstrElementName;
 
 		/* FIXME : what should be done id wmw->hFile is already != 0, or the driver is playin' */
-		TRACE("MCI_OPEN_ELEMENT '%s' !\n", lpOpenParms->lpstrElementName);
+		TRACE("MCI_OPEN_ELEMENT %s!\n", debugstr_w(lpOpenParms->lpstrElementName));
 
-		if (lpOpenParms->lpstrElementName && (strlen(lpOpenParms->lpstrElementName) > 0)) {
-		    wmw->hFile = mmioOpenA((LPSTR)lpOpenParms->lpstrElementName, NULL,
-				    MMIO_ALLOCBUF | MMIO_DENYWRITE | MMIO_READWRITE);
+		if (lpOpenParms->lpstrElementName && (strlenW(lpOpenParms->lpstrElementName) > 0)) {
+		    wmw->hFile = mmioOpenW((LPWSTR)lpOpenParms->lpstrElementName, NULL,
+                                           MMIO_ALLOCBUF | MMIO_DENYWRITE | MMIO_READWRITE);
 
 		    if (wmw->hFile == 0) {
-			WARN("can't find file='%s' !\n", lpOpenParms->lpstrElementName);
+			WARN("can't find file=%s!\n", debugstr_w(lpOpenParms->lpstrElementName));
 			dwRet = MCIERR_FILE_NOT_FOUND;
 		    }
 		    else
@@ -423,38 +424,42 @@
 		}
 	    }
 	    else {
-		CHAR  szTmpPath[MAX_PATH];
-		CHAR  szPrefix[4]    = "TMP\0";
+		WCHAR  szTmpPath[MAX_PATH];
+		WCHAR  szPrefix[4];
 
+                szPrefix[0] = 'T';
+                szPrefix[1] = 'M';
+                szPrefix[2] = 'P';
+                szPrefix[3] = '\0';
 		pszTmpFileName = HeapAlloc(GetProcessHeap(),
 				           HEAP_ZERO_MEMORY,
 					   MAX_PATH * sizeof(*pszTmpFileName));
 
-		if (!GetTempPathA(sizeof(szTmpPath), szTmpPath)) {
+		if (!GetTempPathW(sizeof(szTmpPath), szTmpPath)) {
 		    WARN("can't retrieve temp path!\n");
 		    HeapFree(GetProcessHeap(), 0, pszTmpFileName);
 		    return MCIERR_FILE_NOT_FOUND;
 		}
 
-		if (!GetTempFileNameA(szTmpPath, szPrefix, 0, pszTmpFileName)) {
-			WARN("can't retrieve temp file name!\n");
-			HeapFree(GetProcessHeap(), 0, pszTmpFileName);
-			return MCIERR_FILE_NOT_FOUND;
+		if (!GetTempFileNameW(szTmpPath, szPrefix, 0, pszTmpFileName)) {
+                    WARN("can't retrieve temp file name!\n");
+                    HeapFree(GetProcessHeap(), 0, pszTmpFileName);
+                    return MCIERR_FILE_NOT_FOUND;
 		}
 
 		wmw->bTemporaryFile = TRUE;
 
-		TRACE("MCI_OPEN_ELEMENT '%s' !\n", pszTmpFileName);
+		TRACE("MCI_OPEN_ELEMENT %s!\n", debugstr_w(pszTmpFileName));
 
-		if (pszTmpFileName && (strlen(pszTmpFileName) > 0)) {
+		if (pszTmpFileName && (strlenW(pszTmpFileName) > 0)) {
 
-		    wmw->hFile = mmioOpenA(pszTmpFileName, NULL,
+		    wmw->hFile = mmioOpenW(pszTmpFileName, NULL,
 				           MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_CREATE);
 
 		    if (wmw->hFile == 0) {
+			WARN("can't create file=%s!\n", debugstr_w(pszTmpFileName));
 			/* temporary file could not be created. clean filename. */
 			HeapFree(GetProcessHeap(), 0, pszTmpFileName);
-			WARN("can't create file='%s' !\n", pszTmpFileName);
 			dwRet = MCIERR_FILE_NOT_FOUND;
 		    }
 		}
@@ -617,7 +622,7 @@
      */
     if (wmw->bTemporaryFile)
     {
-	HeapFree(GetProcessHeap(), 0, (char*)wmw->openParms.lpstrElementName);
+	HeapFree(GetProcessHeap(), 0, (WCHAR*)wmw->openParms.lpstrElementName);
 	wmw->openParms.lpstrElementName = NULL;
     }
 
@@ -702,7 +707,7 @@
     }
 
     if (wmw->hFile == 0) {
-	WARN("Can't play: no file='%s' !\n", wmw->openParms.lpstrElementName);
+	WARN("Can't play: no file=%s!\n", debugstr_w(wmw->openParms.lpstrElementName));
 	return MCIERR_FILE_NOT_FOUND;
     }
 
@@ -1230,12 +1235,13 @@
 	    return MCIERR_BAD_INTEGER;
 	}
 
-	if (lpParms->dwAudio & MCI_SET_AUDIO_ALL)
-	    TRACE("MCI_SET_AUDIO_ALL !\n");
-	if (lpParms->dwAudio & MCI_SET_AUDIO_LEFT)
-	    TRACE("MCI_SET_AUDIO_LEFT !\n");
-	if (lpParms->dwAudio & MCI_SET_AUDIO_RIGHT)
-	    TRACE("MCI_SET_AUDIO_RIGHT !\n");
+	switch (lpParms->dwAudio)
+        {
+        case MCI_SET_AUDIO_ALL:         TRACE("MCI_SET_AUDIO_ALL !\n"); break;
+        case MCI_SET_AUDIO_LEFT:        TRACE("MCI_SET_AUDIO_LEFT !\n"); break;
+        case MCI_SET_AUDIO_RIGHT:       TRACE("MCI_SET_AUDIO_RIGHT !\n"); break;
+        default:                        WARN("Unknown audio channel %lu\n", lpParms->dwAudio); break;
+        }
     }
     if (dwFlags & MCI_WAVE_INPUT)
 	TRACE("MCI_WAVE_INPUT !\n");
@@ -1275,7 +1281,7 @@
 /**************************************************************************
  *				WAVE_mciSave		[internal]
  */
-static DWORD WAVE_mciSave(UINT wDevID, DWORD dwFlags, LPMCI_SAVE_PARMS lpParms)
+static DWORD WAVE_mciSave(UINT wDevID, DWORD dwFlags, LPMCI_SAVE_PARMSW lpParms)
 {
     WINE_MCIWAVE*	wmw = WAVE_mciGetOpenDev(wDevID);
     DWORD		ret = MCIERR_FILE_NOT_SAVED, tmpRet;
@@ -1306,10 +1312,10 @@
       careful not to lose our previous error code.
     */
     tmpRet = GetLastError();
-    DeleteFileA (lpParms->lpfilename);
+    DeleteFileW (lpParms->lpfilename);
     SetLastError(tmpRet);
 
-    if (0 == mmioRenameA(wmw->openParms.lpstrElementName, lpParms->lpfilename, 0, 0 )) {
+    if (0 == mmioRenameW(wmw->openParms.lpstrElementName, lpParms->lpfilename, 0, 0 )) {
 	ret = ERROR_SUCCESS;
     }
 
@@ -1541,10 +1547,10 @@
 /**************************************************************************
  * 				WAVE_mciInfo			[internal]
  */
-static DWORD WAVE_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSA lpParms)
+static DWORD WAVE_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)
 {
     DWORD		ret = 0;
-    LPCSTR		str = 0;
+    LPCWSTR		str = 0;
     WINE_MCIWAVE*	wmw = WAVE_mciGetOpenDev(wDevID);
 
     TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
@@ -1554,31 +1560,27 @@
     } else if (wmw == NULL) {
 	ret = MCIERR_INVALID_DEVICE_ID;
     } else {
+        static const WCHAR wszAudio  [] = {'W','i','n','e','\'','s',' ','a','u','d','i','o',' ','p','l','a','y','e','r',0};
+        static const WCHAR wszWaveIn [] = {'W','i','n','e',' ','W','a','v','e',' ','I','n',0};
+        static const WCHAR wszWaveOut[] = {'W','i','n','e',' ','W','a','v','e',' ','O','u','t',0};
+
 	TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
 
 	switch (dwFlags & ~(MCI_WAIT|MCI_NOTIFY)) {
-	case MCI_INFO_PRODUCT:
-	    str = "Wine's audio player";
-	    break;
-	case MCI_INFO_FILE:
-	    str = wmw->openParms.lpstrElementName;
-	    break;
-	case MCI_WAVE_INPUT:
-	    str = "Wine Wave In";
-	    break;
-	case MCI_WAVE_OUTPUT:
-	    str = "Wine Wave Out";
-	    break;
+	case MCI_INFO_PRODUCT: str = wszAudio; break;
+	case MCI_INFO_FILE:    str = wmw->openParms.lpstrElementName; break;
+	case MCI_WAVE_INPUT:   str = wszWaveIn; break;
+	case MCI_WAVE_OUTPUT:  str = wszWaveOut; break;
 	default:
 	    WARN("Don't know this info command (%lu)\n", dwFlags);
 	    ret = MCIERR_UNRECOGNIZED_COMMAND;
 	}
     }
     if (str) {
-	if (strlen(str) + 1 > lpParms->dwRetSize) {
+	if (strlenW(str) + 1 > lpParms->dwRetSize) {
 	    ret = MCIERR_PARAM_OVERFLOW;
 	} else {
-	    lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize);
+	    lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize);
 	}
     } else {
 	lpParms->lpstrReturn[0] = 0;
@@ -1599,7 +1601,7 @@
     switch (wMsg) {
     case DRV_LOAD:		return 1;
     case DRV_FREE:		return 1;
-    case DRV_OPEN:		return WAVE_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2);
+    case DRV_OPEN:		return WAVE_drvOpen((LPCWSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSW)dwParam2);
     case DRV_CLOSE:		return WAVE_drvClose(dwDevID);
     case DRV_ENABLE:		return 1;
     case DRV_DISABLE:		return 1;
@@ -1612,7 +1614,7 @@
     if (dwDevID == 0xFFFFFFFF) return MCIERR_UNSUPPORTED_FUNCTION;
 
     switch (wMsg) {
-    case MCI_OPEN_DRIVER:	return WAVE_mciOpen      (dwDevID, dwParam1, (LPMCI_WAVE_OPEN_PARMSA)  dwParam2);
+    case MCI_OPEN_DRIVER:	return WAVE_mciOpen      (dwDevID, dwParam1, (LPMCI_WAVE_OPEN_PARMSW)  dwParam2);
     case MCI_CLOSE_DRIVER:	return WAVE_mciClose     (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)     dwParam2);
     case MCI_CUE:		return WAVE_mciCue       (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)     dwParam2);
     case MCI_PLAY:		return WAVE_mciPlay      (dwDevID, dwParam1, (LPMCI_PLAY_PARMS)        dwParam2);
@@ -1623,9 +1625,9 @@
     case MCI_RESUME:		return WAVE_mciResume    (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)     dwParam2);
     case MCI_STATUS:		return WAVE_mciStatus    (dwDevID, dwParam1, (LPMCI_STATUS_PARMS)      dwParam2);
     case MCI_GETDEVCAPS:	return WAVE_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)  dwParam2);
-    case MCI_INFO:		return WAVE_mciInfo      (dwDevID, dwParam1, (LPMCI_INFO_PARMSA)       dwParam2);
+    case MCI_INFO:		return WAVE_mciInfo      (dwDevID, dwParam1, (LPMCI_INFO_PARMSW)       dwParam2);
     case MCI_SEEK:		return WAVE_mciSeek      (dwDevID, dwParam1, (LPMCI_SEEK_PARMS)        dwParam2);
-    case MCI_SAVE:		return WAVE_mciSave	 (dwDevID, dwParam1, (LPMCI_SAVE_PARMS)	       dwParam2);
+    case MCI_SAVE:		return WAVE_mciSave	 (dwDevID, dwParam1, (LPMCI_SAVE_PARMSW)       dwParam2);
 	/* commands that should be supported */
     case MCI_LOAD:
     case MCI_FREEZE:
diff --git a/dlls/winmm/message16.c b/dlls/winmm/message16.c
index 5eff2ca..f95de2e 100644
--- a/dlls/winmm/message16.c
+++ b/dlls/winmm/message16.c
@@ -1,5 +1,3 @@
-/* -*- tab-width: 8; c-basic-offset: 4 -*- */
-
 /*
  * MMSYSTEM MCI and low level mapping functions
  *
@@ -70,33 +68,33 @@
  * ================================= */
 
 /**************************************************************************
- * 				MMDRV_Aux_Map16To32A		[internal]
+ * 				MMDRV_Aux_Map16To32W		[internal]
  */
-static  WINMM_MapType	MMDRV_Aux_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Aux_Map16To32W  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
 
 /**************************************************************************
- * 				MMDRV_Aux_UnMap16To32A		[internal]
+ * 				MMDRV_Aux_UnMap16To32W		[internal]
  */
-static  WINMM_MapType	MMDRV_Aux_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_Aux_UnMap16To32W(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     return WINMM_MAP_MSGERROR;
 }
 
 /**************************************************************************
- * 				MMDRV_Aux_Map32ATo16		[internal]
+ * 				MMDRV_Aux_Map32WTo16		[internal]
  */
-static  WINMM_MapType	MMDRV_Aux_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Aux_Map32WTo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
 
 /**************************************************************************
- * 				MMDRV_Aux_UnMap32ATo16		[internal]
+ * 				MMDRV_Aux_UnMap32WTo16		[internal]
  */
-static  WINMM_MapType	MMDRV_Aux_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_Aux_UnMap32WTo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
 #if 0
  case AUXDM_GETDEVCAPS:
@@ -126,17 +124,17 @@
  * ================================= */
 
 /**************************************************************************
- * 				xMMDRV_Mixer_Map16To32A		[internal]
+ * 				xMMDRV_Mixer_Map16To32W		[internal]
  */
-static  WINMM_MapType	MMDRV_Mixer_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Mixer_Map16To32W  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
 
 /**************************************************************************
- * 				MMDRV_Mixer_UnMap16To32A	[internal]
+ * 				MMDRV_Mixer_UnMap16To32W	[internal]
  */
-static  WINMM_MapType	MMDRV_Mixer_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_Mixer_UnMap16To32W(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
 #if 0
     MIXERCAPSA	micA;
@@ -156,17 +154,17 @@
 }
 
 /**************************************************************************
- * 				MMDRV_Mixer_Map32ATo16		[internal]
+ * 				MMDRV_Mixer_Map32WTo16		[internal]
  */
-static  WINMM_MapType	MMDRV_Mixer_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_Mixer_Map32WTo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
 
 /**************************************************************************
- * 				MMDRV_Mixer_UnMap32ATo16	[internal]
+ * 				MMDRV_Mixer_UnMap32WTo16	[internal]
  */
-static  WINMM_MapType	MMDRV_Mixer_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_Mixer_UnMap32WTo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -187,33 +185,33 @@
  * ================================= */
 
 /**************************************************************************
- * 				MMDRV_MidiIn_Map16To32A		[internal]
+ * 				MMDRV_MidiIn_Map16To32W		[internal]
  */
-static  WINMM_MapType	MMDRV_MidiIn_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiIn_Map16To32W  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
 
 /**************************************************************************
- * 				MMDRV_MidiIn_UnMap16To32A	[internal]
+ * 				MMDRV_MidiIn_UnMap16To32W	[internal]
  */
-static  WINMM_MapType	MMDRV_MidiIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_MidiIn_UnMap16To32W(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     return WINMM_MAP_MSGERROR;
 }
 
 /**************************************************************************
- * 				MMDRV_MidiIn_Map32ATo16		[internal]
+ * 				MMDRV_MidiIn_Map32WTo16		[internal]
  */
-static  WINMM_MapType	MMDRV_MidiIn_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiIn_Map32WTo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     return WINMM_MAP_MSGERROR;
 }
 
 /**************************************************************************
- * 				MMDRV_MidiIn_UnMap32ATo16	[internal]
+ * 				MMDRV_MidiIn_UnMap32WTo16	[internal]
  */
-static  WINMM_MapType	MMDRV_MidiIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_MidiIn_UnMap32WTo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     return WINMM_MAP_MSGERROR;
 }
@@ -275,9 +273,9 @@
  * ================================= */
 
 /**************************************************************************
- * 				MMDRV_MidiOut_Map16To32A	[internal]
+ * 				MMDRV_MidiOut_Map16To32W	[internal]
  */
-static  WINMM_MapType	MMDRV_MidiOut_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiOut_Map16To32W  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -368,9 +366,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_MidiOut_UnMap16To32A	[internal]
+ * 				MMDRV_MidiOut_UnMap16To32W	[internal]
  */
-static  WINMM_MapType	MMDRV_MidiOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_MidiOut_UnMap16To32W(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -440,9 +438,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_MidiOut_Map32ATo16	[internal]
+ * 				MMDRV_MidiOut_Map32WTo16	[internal]
  */
-static  WINMM_MapType	MMDRV_MidiOut_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_MidiOut_Map32WTo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -580,9 +578,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_MidiOut_UnMap32ATo16	[internal]
+ * 				MMDRV_MidiOut_UnMap32WTo16	[internal]
  */
-static  WINMM_MapType	MMDRV_MidiOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_MidiOut_UnMap32WTo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -706,9 +704,9 @@
  * ================================= */
 
 /**************************************************************************
- * 				MMDRV_WaveIn_Map16To32A		[internal]
+ * 				MMDRV_WaveIn_Map16To32W		[internal]
  */
-static  WINMM_MapType	MMDRV_WaveIn_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveIn_Map16To32W  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -815,9 +813,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_WaveIn_UnMap16To32A	[internal]
+ * 				MMDRV_WaveIn_UnMap16To32W	[internal]
  */
-static  WINMM_MapType	MMDRV_WaveIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_WaveIn_UnMap16To32W(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -888,9 +886,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_WaveIn_Map32ATo16		[internal]
+ * 				MMDRV_WaveIn_Map32WTo16		[internal]
  */
-static  WINMM_MapType	MMDRV_WaveIn_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveIn_Map32WTo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -1058,9 +1056,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_WaveIn_UnMap32ATo16	[internal]
+ * 				MMDRV_WaveIn_UnMap32WTo16	[internal]
  */
-static  WINMM_MapType	MMDRV_WaveIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_WaveIn_UnMap32WTo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -1197,9 +1195,9 @@
  * ================================= */
 
 /**************************************************************************
- * 				MMDRV_WaveOut_Map16To32A	[internal]
+ * 				MMDRV_WaveOut_Map16To32W	[internal]
  */
-static  WINMM_MapType	MMDRV_WaveOut_Map16To32A  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveOut_Map16To32W  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -1315,9 +1313,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_WaveOut_UnMap16To32A	[internal]
+ * 				MMDRV_WaveOut_UnMap16To32W	[internal]
  */
-static  WINMM_MapType	MMDRV_WaveOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_WaveOut_UnMap16To32W(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     WINMM_MapType	ret = WINMM_MAP_MSGERROR;
 
@@ -1399,9 +1397,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_WaveOut_Map32ATo16	[internal]
+ * 				MMDRV_WaveOut_Map32WTo16	[internal]
  */
-static  WINMM_MapType	MMDRV_WaveOut_Map32ATo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
+static  WINMM_MapType	MMDRV_WaveOut_Map32WTo16  (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
 {
     WINMM_MapType	ret;
 
@@ -1588,9 +1586,9 @@
 }
 
 /**************************************************************************
- * 				MMDRV_WaveOut_UnMap32ATo16	[internal]
+ * 				MMDRV_WaveOut_UnMap32WTo16	[internal]
  */
-static  WINMM_MapType	MMDRV_WaveOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
+static  WINMM_MapType	MMDRV_WaveOut_UnMap32WTo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
 {
     WINMM_MapType	ret;
 
@@ -1855,270 +1853,13 @@
  *              M C I
  * ================================= */
 
-/**************************************************************************
- * 			MCI_MapMsg16To32A			[internal]
+#if 0
+/* FIXME: this code is kept for not yet implemented optimisation for an application
+ * using the 32A MCI interface and calling a 16 bit driver.
+ * For now, we're doing two conversions:
+ * - 32A => 32W (in 32 bit MCI code)
+ * - 32W => 16  in this file
  */
-static WINMM_MapType	MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam)
-{
-    if (*lParam == 0)
-	return WINMM_MAP_OK;
-    /* FIXME: to add also (with seg/linear modifications to do):
-     * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
-     * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
-     */
-    switch (wMsg) {
-	/* case MCI_CAPTURE */
-    case MCI_CLOSE:
-    case MCI_CLOSE_DRIVER:
-    case MCI_CONFIGURE:
-    case MCI_COPY:
-    case MCI_CUE:
-    case MCI_CUT:
-    case MCI_DELETE:
-    case MCI_FREEZE:
-    case MCI_GETDEVCAPS:
-	/* case MCI_INDEX: */
-	/* case MCI_MARK: */
-	/* case MCI_MONITOR: */
-    case MCI_PASTE:
-    case MCI_PAUSE:
-    case MCI_PLAY:
-    case MCI_PUT:
-    case MCI_REALIZE:
-    case MCI_RECORD:
-    case MCI_RESUME:
-    case MCI_SEEK:
-    case MCI_SET:
-	/* case MCI_SETTIMECODE:*/
-	/* case MCI_SIGNAL:*/
-    case MCI_SPIN:
-    case MCI_STATUS:		/* FIXME: is wrong for digital video */
-    case MCI_STEP:
-    case MCI_STOP:
-	/* case MCI_UNDO: */
-    case MCI_UNFREEZE:
-    case MCI_UPDATE:
-    case MCI_WHERE:
-	*lParam = (DWORD)MapSL(*lParam);
-	return WINMM_MAP_OK;
-    case MCI_WINDOW:
-	/* in fact, I would also need the dwFlags... to see
-	 * which members of lParam are effectively used
-	 */
-	*lParam = (DWORD)MapSL(*lParam);
-	FIXME("Current mapping may be wrong\n");
-	break;
-    case MCI_BREAK:
-	{
-            LPMCI_BREAK_PARMS		mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_BREAK_PARMS));
-	    LPMCI_BREAK_PARMS16		mbp16 = MapSL(*lParam);
-
-	    if (mbp32) {
-		mbp32->dwCallback = mbp16->dwCallback;
-		mbp32->nVirtKey = mbp16->nVirtKey;
-		mbp32->hwndBreak = HWND_32(mbp16->hwndBreak);
-	    } else {
-		return WINMM_MAP_NOMEM;
-	    }
-	    *lParam = (DWORD)mbp32;
-	}
-	return WINMM_MAP_OKMEM;
-    case MCI_ESCAPE:
-	{
-            LPMCI_VD_ESCAPE_PARMSA	mvep32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_VD_ESCAPE_PARMSA));
-	    LPMCI_VD_ESCAPE_PARMS16	mvep16  = MapSL(*lParam);
-
-	    if (mvep32a) {
-		mvep32a->dwCallback       = mvep16->dwCallback;
-		mvep32a->lpstrCommand     = MapSL(mvep16->lpstrCommand);
-	    } else {
-		return WINMM_MAP_NOMEM;
-	    }
-	    *lParam = (DWORD)mvep32a;
-	}
-	return WINMM_MAP_OKMEM;
-    case MCI_INFO:
-	{
-            LPMCI_INFO_PARMSA	mip32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_INFO_PARMSA));
-	    LPMCI_INFO_PARMS16	mip16  = MapSL(*lParam);
-
-	    /* FIXME this is wrong if device is of type
-	     * MCI_DEVTYPE_DIGITAL_VIDEO, some members are not mapped
-	     */
-	    if (mip32a) {
-		mip32a->dwCallback  = mip16->dwCallback;
-		mip32a->lpstrReturn = MapSL(mip16->lpstrReturn);
-		mip32a->dwRetSize   = mip16->dwRetSize;
-	    } else {
-		return WINMM_MAP_NOMEM;
-	    }
-	    *lParam = (DWORD)mip32a;
-	}
-	return WINMM_MAP_OKMEM;
-    case MCI_OPEN:
-    case MCI_OPEN_DRIVER:
-	{
-            LPMCI_OPEN_PARMSA	mop32a = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_OPEN_PARMSA) + 2 * sizeof(DWORD));
-	    LPMCI_OPEN_PARMS16	mop16  = MapSL(*lParam);
-
-	    if (mop32a) {
-		*(LPMCI_OPEN_PARMS16*)(mop32a) = mop16;
-		mop32a = (LPMCI_OPEN_PARMSA)((char*)mop32a + sizeof(LPMCI_OPEN_PARMS16));
-		mop32a->dwCallback       = mop16->dwCallback;
-		mop32a->wDeviceID        = mop16->wDeviceID;
-		mop32a->lpstrDeviceType  = MapSL(mop16->lpstrDeviceType);
-		mop32a->lpstrElementName = MapSL(mop16->lpstrElementName);
-		mop32a->lpstrAlias       = MapSL(mop16->lpstrAlias);
-		/* copy extended information if any...
-		 * FIXME: this may seg fault if initial structure does not contain them and
-		 * the reads after msip16 fail under LDT limits...
-		 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and
-		 * should not take care of extended parameters, and should be used by MCI_Open
-		 * to fetch uDevType. When, this is known, the mapping for sending the
-		 * MCI_OPEN_DRIVER shall be done depending on uDevType.
-		 */
-		memcpy(mop32a + 1, mop16 + 1, 2 * sizeof(DWORD));
-	    } else {
-		return WINMM_MAP_NOMEM;
-	    }
-	    *lParam = (DWORD)mop32a;
-	}
-	return WINMM_MAP_OKMEM;
-    case MCI_SYSINFO:
-	{
-            LPMCI_SYSINFO_PARMSA	msip32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SYSINFO_PARMSA));
-	    LPMCI_SYSINFO_PARMS16	msip16  = MapSL(*lParam);
-
-	    if (msip32a) {
-		msip32a->dwCallback       = msip16->dwCallback;
-		msip32a->lpstrReturn      = MapSL(msip16->lpstrReturn);
-		msip32a->dwRetSize        = msip16->dwRetSize;
-		msip32a->dwNumber         = msip16->dwNumber;
-		msip32a->wDeviceType      = msip16->wDeviceType;
-	    } else {
-		return WINMM_MAP_NOMEM;
-	    }
-	    *lParam = (DWORD)msip32a;
-	}
-	return WINMM_MAP_OKMEM;
-    case MCI_SOUND:
-	{
-            LPMCI_SOUND_PARMS		mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SOUND_PARMS));
-	    LPMCI_SOUND_PARMS16		mbp16 = MapSL(*lParam);
-
-	    if (mbp32) {
-		mbp32->dwCallback = mbp16->dwCallback;
-		mbp32->lpstrSoundName = MapSL(mbp16->lpstrSoundName);
-	    } else {
-		return WINMM_MAP_NOMEM;
-	    }
-	    *lParam = (DWORD)mbp32;
-	}
-	return WINMM_MAP_OKMEM;
-    case DRV_LOAD:
-    case DRV_ENABLE:
-    case DRV_OPEN:
-    case DRV_CLOSE:
-    case DRV_DISABLE:
-    case DRV_FREE:
-    case DRV_CONFIGURE:
-    case DRV_QUERYCONFIGURE:
-    case DRV_INSTALL:
-    case DRV_REMOVE:
-    case DRV_EXITSESSION:
-    case DRV_EXITAPPLICATION:
-    case DRV_POWER:
-	FIXME("This is a hack\n");
-	return WINMM_MAP_OK;
-
-    default:
-	WARN("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg));
-    }
-    return WINMM_MAP_MSGERROR;
-}
-
-/**************************************************************************
- * 			MCI_UnMapMsg16To32A			[internal]
- */
-static  WINMM_MapType	MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg, DWORD lParam)
-{
-    switch (wMsg) {
-	/* case MCI_CAPTURE */
-    case MCI_CLOSE:
-    case MCI_CLOSE_DRIVER:
-    case MCI_CONFIGURE:
-    case MCI_COPY:
-    case MCI_CUE:
-    case MCI_CUT:
-    case MCI_DELETE:
-    case MCI_FREEZE:
-    case MCI_GETDEVCAPS:
-	/* case MCI_INDEX: */
-	/* case MCI_MARK: */
-	/* case MCI_MONITOR: */
-    case MCI_PASTE:
-    case MCI_PAUSE:
-    case MCI_PLAY:
-    case MCI_PUT:
-    case MCI_REALIZE:
-    case MCI_RECORD:
-    case MCI_RESUME:
-    case MCI_SEEK:
-    case MCI_SET:
-	/* case MCI_SETTIMECODE:*/
-	/* case MCI_SIGNAL:*/
-    case MCI_SPIN:
-    case MCI_STATUS:
-    case MCI_STEP:
-    case MCI_STOP:
-	/* case MCI_UNDO: */
-    case MCI_UNFREEZE:
-    case MCI_UPDATE:
-    case MCI_WHERE:
-	return WINMM_MAP_OK;
-
-    case MCI_WINDOW:
-	/* FIXME ?? see Map function */
-	return WINMM_MAP_OK;
-
-    case MCI_BREAK:
-    case MCI_ESCAPE:
-    case MCI_INFO:
-    case MCI_SYSINFO:
-    case MCI_SOUND:
-	HeapFree(GetProcessHeap(), 0, (LPVOID)lParam);
-	return WINMM_MAP_OK;
-    case MCI_OPEN:
-    case MCI_OPEN_DRIVER:
-	if (lParam) {
-            LPMCI_OPEN_PARMSA	mop32a = (LPMCI_OPEN_PARMSA)lParam;
-	    LPMCI_OPEN_PARMS16	mop16  = *(LPMCI_OPEN_PARMS16*)((char*)mop32a - sizeof(LPMCI_OPEN_PARMS16));
-
-	    mop16->wDeviceID = mop32a->wDeviceID;
-	    if (!HeapFree(GetProcessHeap(), 0, (LPVOID)(lParam - sizeof(LPMCI_OPEN_PARMS16))))
-		FIXME("bad free line=%d\n", __LINE__);
-	}
-	return WINMM_MAP_OK;
-    case DRV_LOAD:
-    case DRV_ENABLE:
-    case DRV_OPEN:
-    case DRV_CLOSE:
-    case DRV_DISABLE:
-    case DRV_FREE:
-    case DRV_CONFIGURE:
-    case DRV_QUERYCONFIGURE:
-    case DRV_INSTALL:
-    case DRV_REMOVE:
-    case DRV_EXITSESSION:
-    case DRV_EXITAPPLICATION:
-    case DRV_POWER:
-	FIXME("This is a hack\n");
-	return WINMM_MAP_OK;
-    default:
-	FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg));
-    }
-    return WINMM_MAP_MSGERROR;
-}
 
 /*
  * 0000 stop
@@ -2132,7 +1873,7 @@
  */
 
 /**************************************************************************
- * 			MCI_MsgMapper32To16_Create		[internal]
+ * 			MCI_MsgMapper32ATo16_Create		[internal]
  *
  * Helper for MCI_MapMsg32ATo16.
  * Maps the 32 bit pointer (*ptr), of size bytes, to an allocated 16 bit
@@ -2141,7 +1882,7 @@
  * above)
  * if keep is TRUE, keeps track of in 32 bit ptr in allocated 16 bit area.
  */
-static	WINMM_MapType	MCI_MsgMapper32To16_Create(void** ptr, int size16, DWORD map, BOOLEAN keep)
+static	WINMM_MapType	MCI_MsgMapper32ATo16_Create(void** ptr, int size16, DWORD map, BOOLEAN keep)
 {
     void*	lp = HeapAlloc( GetProcessHeap(), 0, (keep ? sizeof(void**) : 0) + size16 );
     LPBYTE	p16, p32;
@@ -2212,11 +1953,11 @@
 }
 
 /**************************************************************************
- * 			MCI_MsgMapper32To16_Destroy		[internal]
+ * 			MCI_MsgMapper32ATo16_Destroy		[internal]
  *
  * Helper for MCI_UnMapMsg32ATo16.
  */
-static	WINMM_MapType	MCI_MsgMapper32To16_Destroy(void* ptr, int size16, DWORD map, BOOLEAN kept)
+static	WINMM_MapType	MCI_MsgMapper32ATo16_Destroy(void* ptr, int size16, DWORD map, BOOLEAN kept)
 {
     if (ptr) {
 	void*		msg16 = MapSL((SEGPTR)ptr);
@@ -2558,7 +2299,7 @@
             LPMCI_OPEN_DRIVER_PARMSA  modp32a = (LPMCI_OPEN_DRIVER_PARMSA)(*lParam);
             LPMCI_OPEN_DRIVER_PARMS16 modp16;
             char *ptr = HeapAlloc( GetProcessHeap(), 0,
-                                  sizeof(LPMCI_OPEN_DRIVER_PARMSA) + sizeof(MCI_OPEN_DRIVER_PARMS16));
+                                   sizeof(LPMCI_OPEN_DRIVER_PARMSA) + sizeof(MCI_OPEN_DRIVER_PARMS16));
 
 	    if (ptr) {
 		*(LPMCI_OPEN_DRIVER_PARMSA*)(ptr) = modp32a;
@@ -2587,10 +2328,10 @@
 	return WINMM_MAP_OK;
 
     default:
-	WARN("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg));
+	FIXME("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg));
 	return WINMM_MAP_MSGERROR;
     }
-    return MCI_MsgMapper32To16_Create((void**)lParam, size, map, keep);
+    return MCI_MsgMapper32ATo16_Create((void**)lParam, size, map, keep);
 }
 
 /**************************************************************************
@@ -2774,14 +2515,1000 @@
 	FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg));
 	return WINMM_MAP_MSGERROR;
     }
-    return MCI_MsgMapper32To16_Destroy((void*)lParam, size, map, kept);
+    return MCI_MsgMapper32ATo16_Destroy((void*)lParam, size, map, kept);
+}
+#endif
+
+/**************************************************************************
+ * 			MCI_MapMsg16To32W			[internal]
+ */
+static WINMM_MapType	MCI_MapMsg16To32W(WORD uDevType, WORD wMsg, DWORD* lParam)
+{
+    if (*lParam == 0)
+	return WINMM_MAP_OK;
+    /* FIXME: to add also (with seg/linear modifications to do):
+     * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
+     * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
+     */
+    switch (wMsg) {
+	/* case MCI_CAPTURE */
+    case MCI_CLOSE:
+    case MCI_CLOSE_DRIVER:
+    case MCI_CONFIGURE:
+    case MCI_COPY:
+    case MCI_CUE:
+    case MCI_CUT:
+    case MCI_DELETE:
+    case MCI_FREEZE:
+    case MCI_GETDEVCAPS:
+	/* case MCI_INDEX: */
+	/* case MCI_MARK: */
+	/* case MCI_MONITOR: */
+    case MCI_PASTE:
+    case MCI_PAUSE:
+    case MCI_PLAY:
+    case MCI_PUT:
+    case MCI_REALIZE:
+    case MCI_RECORD:
+    case MCI_RESUME:
+    case MCI_SEEK:
+    case MCI_SET:
+	/* case MCI_SETTIMECODE:*/
+	/* case MCI_SIGNAL:*/
+    case MCI_SPIN:
+    case MCI_STATUS:		/* FIXME: is wrong for digital video */
+    case MCI_STEP:
+    case MCI_STOP:
+	/* case MCI_UNDO: */
+    case MCI_UNFREEZE:
+    case MCI_UPDATE:
+    case MCI_WHERE:
+	*lParam = (DWORD)MapSL(*lParam);
+	return WINMM_MAP_OK;
+    case MCI_WINDOW:
+	/* in fact, I would also need the dwFlags... to see
+	 * which members of lParam are effectively used
+	 */
+	*lParam = (DWORD)MapSL(*lParam);
+	FIXME("Current mapping may be wrong\n");
+	break;
+    case MCI_BREAK:
+	{
+            LPMCI_BREAK_PARMS		mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_BREAK_PARMS));
+	    LPMCI_BREAK_PARMS16		mbp16 = MapSL(*lParam);
+
+	    if (mbp32) {
+		mbp32->dwCallback = mbp16->dwCallback;
+		mbp32->nVirtKey = mbp16->nVirtKey;
+		mbp32->hwndBreak = HWND_32(mbp16->hwndBreak);
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (DWORD)mbp32;
+	}
+	return WINMM_MAP_OKMEM;
+    case MCI_ESCAPE:
+	{
+            LPMCI_VD_ESCAPE_PARMSW	mvep32w = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_VD_ESCAPE_PARMSW));
+	    LPMCI_VD_ESCAPE_PARMS16	mvep16  = MapSL(*lParam);
+
+	    if (mvep32w) {
+		mvep32w->dwCallback       = mvep16->dwCallback;
+		mvep32w->lpstrCommand     = MCI_strdupAtoW(MapSL(mvep16->lpstrCommand));
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (DWORD)mvep32w;
+	}
+	return WINMM_MAP_OKMEM;
+    case MCI_INFO:
+	{
+            LPMCI_INFO_PARMSW	mip32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_INFO_PARMSW));
+	    LPMCI_INFO_PARMS16	mip16  = MapSL(*lParam);
+
+	    /* FIXME this is wrong if device is of type
+	     * MCI_DEVTYPE_DIGITAL_VIDEO, some members are not mapped
+	     */
+	    if (mip32w) {
+		*(LPMCI_INFO_PARMS16*)(mip32w) = mip16;
+		mip32w = (LPMCI_INFO_PARMSW)((char*)mip32w + sizeof(LPMCI_INFO_PARMS16));
+		mip32w->dwCallback  = mip16->dwCallback;
+		mip32w->lpstrReturn = HeapAlloc(GetProcessHeap(), 0, mip16->dwRetSize * sizeof(WCHAR));
+		mip32w->dwRetSize   = mip16->dwRetSize * sizeof(WCHAR);
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (DWORD)mip32w;
+	}
+	return WINMM_MAP_OKMEM;
+    case MCI_OPEN:
+    case MCI_OPEN_DRIVER:
+	{
+            LPMCI_OPEN_PARMSW	mop32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_OPEN_PARMSW) + 2 * sizeof(DWORD));
+	    LPMCI_OPEN_PARMS16	mop16  = MapSL(*lParam);
+
+	    if (mop32w) {
+		*(LPMCI_OPEN_PARMS16*)(mop32w) = mop16;
+		mop32w = (LPMCI_OPEN_PARMSW)((char*)mop32w + sizeof(LPMCI_OPEN_PARMS16));
+		mop32w->dwCallback       = mop16->dwCallback;
+		mop32w->wDeviceID        = mop16->wDeviceID;
+		mop32w->lpstrDeviceType  = MCI_strdupAtoW(MapSL(mop16->lpstrDeviceType));
+                mop32w->lpstrElementName = MCI_strdupAtoW(MapSL(mop16->lpstrElementName));
+                mop32w->lpstrAlias       = MCI_strdupAtoW(MapSL(mop16->lpstrAlias));
+		/* copy extended information if any...
+		 * FIXME: this may seg fault if initial structure does not contain them and
+		 * the reads after msip16 fail under LDT limits...
+		 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and
+		 * should not take care of extended parameters, and should be used by MCI_Open
+		 * to fetch uDevType. When, this is known, the mapping for sending the
+		 * MCI_OPEN_DRIVER shall be done depending on uDevType.
+		 */
+		memcpy(mop32w + 1, mop16 + 1, 2 * sizeof(DWORD));
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (DWORD)mop32w;
+	}
+	return WINMM_MAP_OKMEM;
+    case MCI_SYSINFO:
+	{
+            LPMCI_SYSINFO_PARMSW	msip32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_SYSINFO_PARMSW));
+	    LPMCI_SYSINFO_PARMS16	msip16  = MapSL(*lParam);
+
+	    if (msip32w) {
+		*(LPMCI_SYSINFO_PARMS16*)(msip32w) = msip16;
+		msip32w = (LPMCI_SYSINFO_PARMSW)((char*)msip32w + sizeof(LPMCI_OPEN_PARMS16));
+		msip32w->dwCallback       = msip16->dwCallback;
+		msip32w->lpstrReturn      = HeapAlloc(GetProcessHeap(), 0, msip16->dwRetSize * sizeof(WCHAR));
+		msip32w->dwRetSize        = msip16->dwRetSize;
+		msip32w->dwNumber         = msip16->dwNumber;
+		msip32w->wDeviceType      = msip16->wDeviceType;
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (DWORD)msip32w;
+	}
+	return WINMM_MAP_OKMEM;
+    case MCI_SOUND:
+	{
+            LPMCI_SOUND_PARMSW		mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SOUND_PARMSW));
+	    LPMCI_SOUND_PARMS16		mbp16 = MapSL(*lParam);
+
+	    if (mbp32) {
+		mbp32->dwCallback = mbp16->dwCallback;
+		mbp32->lpstrSoundName = MCI_strdupAtoW(MapSL(mbp16->lpstrSoundName));
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (DWORD)mbp32;
+	}
+	return WINMM_MAP_OKMEM;
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_OPEN:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case DRV_CONFIGURE:
+    case DRV_QUERYCONFIGURE:
+    case DRV_INSTALL:
+    case DRV_REMOVE:
+    case DRV_EXITSESSION:
+    case DRV_EXITAPPLICATION:
+    case DRV_POWER:
+	FIXME("This is a hack\n");
+	return WINMM_MAP_OK;
+    default:
+	FIXME("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg));
+    }
+    return WINMM_MAP_MSGERROR;
+}
+
+/**************************************************************************
+ * 			MCI_UnMapMsg16To32W			[internal]
+ */
+static  WINMM_MapType	MCI_UnMapMsg16To32W(WORD uDevType, WORD wMsg, DWORD lParam)
+{
+    switch (wMsg) {
+	/* case MCI_CAPTURE */
+    case MCI_CLOSE:
+    case MCI_CLOSE_DRIVER:
+    case MCI_CONFIGURE:
+    case MCI_COPY:
+    case MCI_CUE:
+    case MCI_CUT:
+    case MCI_DELETE:
+    case MCI_FREEZE:
+    case MCI_GETDEVCAPS:
+	/* case MCI_INDEX: */
+	/* case MCI_MARK: */
+	/* case MCI_MONITOR: */
+    case MCI_PASTE:
+    case MCI_PAUSE:
+    case MCI_PLAY:
+    case MCI_PUT:
+    case MCI_REALIZE:
+    case MCI_RECORD:
+    case MCI_RESUME:
+    case MCI_SEEK:
+    case MCI_SET:
+	/* case MCI_SETTIMECODE:*/
+	/* case MCI_SIGNAL:*/
+    case MCI_SPIN:
+    case MCI_STATUS:
+    case MCI_STEP:
+    case MCI_STOP:
+	/* case MCI_UNDO: */
+    case MCI_UNFREEZE:
+    case MCI_UPDATE:
+    case MCI_WHERE:
+	return WINMM_MAP_OK;
+
+    case MCI_WINDOW:
+	/* FIXME ?? see Map function */
+	return WINMM_MAP_OK;
+
+    case MCI_BREAK:
+	HeapFree(GetProcessHeap(), 0, (LPVOID)lParam);
+	return WINMM_MAP_OK;
+    case MCI_ESCAPE:
+        if (lParam) {
+            LPMCI_VD_ESCAPE_PARMSW	mvep32W = (LPMCI_VD_ESCAPE_PARMSW)lParam;
+            HeapFree(GetProcessHeap(), 0, (LPVOID)mvep32W->lpstrCommand);
+            HeapFree(GetProcessHeap(), 0, (LPVOID)lParam);
+        }
+	return WINMM_MAP_OK;
+    case MCI_INFO:
+        if (lParam) {
+            LPMCI_INFO_PARMSW	        mip32w = (LPMCI_INFO_PARMSW)lParam;
+	    LPMCI_INFO_PARMS16          mip16  = *(LPMCI_INFO_PARMS16*)((char*)mip32w - sizeof(LPMCI_INFO_PARMS16));
+
+            WideCharToMultiByte(CP_ACP, 0,
+                                mip32w->lpstrReturn, mip32w->dwRetSize / sizeof(WCHAR),
+                                MapSL(mip16->lpstrReturn), mip16->dwRetSize,
+                                NULL, NULL);
+            HeapFree(GetProcessHeap(), 0, (LPVOID)mip32w->lpstrReturn);
+            HeapFree(GetProcessHeap(), 0, (LPVOID)lParam);
+        }
+	return WINMM_MAP_OK;
+    case MCI_SYSINFO:
+        if (lParam) {
+            LPMCI_SYSINFO_PARMSW	   msip32w = (LPMCI_SYSINFO_PARMSW)lParam;
+	    LPMCI_SYSINFO_PARMS16          msip16  = *(LPMCI_SYSINFO_PARMS16*)((char*)msip32w - sizeof(LPMCI_SYSINFO_PARMS16));
+
+            WideCharToMultiByte(CP_ACP, 0,
+                                msip32w->lpstrReturn, msip32w->dwRetSize,
+                                MapSL(msip16->lpstrReturn), msip16->dwRetSize,
+                                NULL, NULL);
+            HeapFree(GetProcessHeap(), 0, (LPVOID)msip32w->lpstrReturn);
+            HeapFree(GetProcessHeap(), 0, (LPVOID)lParam);
+        }
+	return WINMM_MAP_OK;
+    case MCI_SOUND:
+        if (lParam) {
+            LPMCI_SOUND_PARMSW          msp32W = (LPMCI_SOUND_PARMSW)lParam;
+            HeapFree(GetProcessHeap(), 0, (LPVOID)msp32W->lpstrSoundName);
+            HeapFree(GetProcessHeap(), 0, (LPVOID)lParam);
+        }
+	return WINMM_MAP_OK;
+    case MCI_OPEN:
+    case MCI_OPEN_DRIVER:
+	if (lParam) {
+            LPMCI_OPEN_PARMSW	mop32w = (LPMCI_OPEN_PARMSW)lParam;
+	    LPMCI_OPEN_PARMS16	mop16  = *(LPMCI_OPEN_PARMS16*)((char*)mop32w - sizeof(LPMCI_OPEN_PARMS16));
+
+	    mop16->wDeviceID = mop32w->wDeviceID;
+            HeapFree(GetProcessHeap(), 0, mop32w->lpstrDeviceType);
+            HeapFree(GetProcessHeap(), 0, mop32w->lpstrElementName);
+            HeapFree(GetProcessHeap(), 0, mop32w->lpstrAlias);
+	    if (!HeapFree(GetProcessHeap(), 0, (LPVOID)(lParam - sizeof(LPMCI_OPEN_PARMS16))))
+		FIXME("bad free line=%d\n", __LINE__);
+	}
+	return WINMM_MAP_OK;
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_OPEN:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case DRV_CONFIGURE:
+    case DRV_QUERYCONFIGURE:
+    case DRV_INSTALL:
+    case DRV_REMOVE:
+    case DRV_EXITSESSION:
+    case DRV_EXITAPPLICATION:
+    case DRV_POWER:
+	FIXME("This is a hack\n");
+	return WINMM_MAP_OK;
+    default:
+	FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg));
+    }
+    return WINMM_MAP_MSGERROR;
+}
+
+/*
+ * 0000 stop
+ * 0001 squeeze   signed 4 bytes to 2 bytes     *( LPINT16)D = ( INT16)*( LPINT16)S; D += 2;     S += 4
+ * 0010 squeeze unsigned 4 bytes to 2 bytes     *(LPUINT16)D = (UINT16)*(LPUINT16)S; D += 2;     S += 4
+ * 0100
+ * 0101
+ * 0110 zero 4 bytes                            *(DWORD)D = 0                        D += 4;     S += 4
+ * 0111 copy string                             *(LPSTR*)D = seg dup(*(LPSTR*)S)     D += 4;     S += 4
+ * 1xxx copy xxx + 1 bytes                      memcpy(D, S, xxx + 1);               D += xxx+1; S += xxx+1
+ */
+
+/**************************************************************************
+ * 			MCI_MsgMapper32WTo16_Create		[internal]
+ *
+ * Helper for MCI_MapMsg32WTo16.
+ * Maps the 32 bit pointer (*ptr), of size bytes, to an allocated 16 bit
+ * segmented pointer.
+ * map contains a list of action to be performed for the mapping (see list
+ * above)
+ * if keep is TRUE, keeps track of in 32 bit ptr in allocated 16 bit area.
+ */
+static	WINMM_MapType	MCI_MsgMapper32WTo16_Create(void** ptr, int size16, DWORD map, BOOLEAN keep)
+{
+    void*	lp = HeapAlloc( GetProcessHeap(), 0, (keep ? sizeof(void**) : 0) + size16 );
+    LPBYTE	p16, p32;
+
+    if (!lp) {
+	return WINMM_MAP_NOMEM;
+    }
+    p32 = (LPBYTE)(*ptr);
+    if (keep) {
+	*(void**)lp = *ptr;
+	p16 = (LPBYTE)lp + sizeof(void**);
+	*ptr = (char*)MapLS(lp) + sizeof(void**);
+    } else {
+	p16 = lp;
+	*ptr = (void*)MapLS(lp);
+    }
+
+    if (map == 0) {
+	memcpy(p16, p32, size16);
+    } else {
+	unsigned	nibble;
+	unsigned	sz;
+
+	while (map & 0xF) {
+	    nibble = map & 0xF;
+	    if (nibble & 0x8) {
+		sz = (nibble & 7) + 1;
+		memcpy(p16, p32, sz);
+		p16 += sz;
+		p32 += sz;
+		size16 -= sz;	/* DEBUG only */
+	    } else {
+		switch (nibble) {
+		case 0x1:
+                    *(LPINT16)p16 = *(LPINT)p32;
+                    p16 += sizeof(INT16);
+                    p32 += sizeof(INT);
+                    size16 -= sizeof(INT16);
+                    break;
+		case 0x2:
+                    *(LPUINT16)p16 = *(LPUINT)p32;
+                    p16 += sizeof(UINT16);
+                    p32 += sizeof(UINT);
+                    size16 -= sizeof(UINT16);
+                    break;
+		case 0x6:
+                    *(LPDWORD)p16 = 0;
+                    p16 += sizeof(DWORD);
+                    p32 += sizeof(DWORD);
+                    size16 -= sizeof(DWORD);
+                    break;
+		case 0x7:
+                    *(SEGPTR *)p16 = MapLS( MCI_strdupWtoA( *(LPCWSTR *)p32 ) );
+                    p16 += sizeof(SEGPTR);
+                    p32 += sizeof(LPSTR);
+                    size16 -= sizeof(SEGPTR);
+                    break;
+		default:
+                    FIXME("Unknown nibble for mapping (%x)\n", nibble);
+		}
+	    }
+	    map >>= 4;
+	}
+	if (size16 != 0) /* DEBUG only */
+	    FIXME("Mismatch between 16 bit struct size and map nibbles serie\n");
+    }
+    return WINMM_MAP_OKMEM;
+}
+
+/**************************************************************************
+ * 			MCI_MsgMapper32WTo16_Destroy		[internal]
+ *
+ * Helper for MCI_UnMapMsg32WTo16.
+ */
+static	WINMM_MapType	MCI_MsgMapper32WTo16_Destroy(void* ptr, int size16, DWORD map, BOOLEAN kept)
+{
+    if (ptr) {
+	void*		msg16 = MapSL((SEGPTR)ptr);
+	void*		alloc;
+	LPBYTE		p32, p16;
+	unsigned	nibble;
+
+        UnMapLS( (SEGPTR)ptr );
+	if (kept) {
+	    alloc = (char*)msg16 - sizeof(void**);
+	    p32 = *(void**)alloc;
+	    p16 = msg16;
+
+	    if (map == 0) {
+		memcpy(p32, p16, size16);
+	    } else {
+		while (map & 0xF) {
+		    nibble = map & 0xF;
+		    if (nibble & 0x8) {
+			memcpy(p32, p16, (nibble & 7) + 1);
+			p16 += (nibble & 7) + 1;
+			p32 += (nibble & 7) + 1;
+			size16 -= (nibble & 7) + 1;
+		    } else {
+			switch (nibble) {
+			case 0x1:
+                            *(LPINT)p32 = *(LPINT16)p16;
+                            p16 += sizeof(INT16);
+                            p32 += sizeof(INT);
+                            size16 -= sizeof(INT16);
+                            break;
+			case 0x2:
+                            *(LPUINT)p32 = *(LPUINT16)p16;
+                            p16 += sizeof(UINT16);
+                            p32 += sizeof(UINT);
+                            size16 -= sizeof(UINT16);
+                            break;
+			case 0x6:
+                            p16 += sizeof(UINT);
+                            p32 += sizeof(UINT);
+                            size16 -= sizeof(UINT);
+                            break;
+			case 0x7:
+                            HeapFree(GetProcessHeap(), 0, MapSL(*(SEGPTR *)p16));
+                            UnMapLS( *(SEGPTR *)p16 );
+                            p16 += sizeof(SEGPTR);
+                            p32 += sizeof(char*);
+                            size16 -= sizeof(SEGPTR);
+                            break;
+			default:
+                            FIXME("Unknown nibble for mapping (%x)\n", nibble);
+			}
+		    }
+		    map >>= 4;
+		}
+		if (size16 != 0) /* DEBUG only */
+		    FIXME("Mismatch between 16 bit struct size and map nibbles serie\n");
+	    }
+	} else {
+	    alloc = msg16;
+	}
+
+        HeapFree( GetProcessHeap(), 0, alloc );
+    }
+    return WINMM_MAP_OK;
+}
+
+/**************************************************************************
+ * 			MCI_MapMsg32WTo16			[internal]
+ *
+ * Map a 32W bit MCI message to a 16 bit MCI message.
+ */
+static  WINMM_MapType	MCI_MapMsg32WTo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD* lParam)
+{
+    int		size;
+    BOOLEAN     keep = FALSE;
+    DWORD	map = 0;
+
+    if (*lParam == 0)
+	return WINMM_MAP_OK;
+
+    /* FIXME: to add also (with seg/linear modifications to do):
+     * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
+     * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
+     */
+    switch (wMsg) {
+    case MCI_BREAK:
+	size = sizeof(MCI_BREAK_PARMS);
+	break;
+	/* case MCI_CAPTURE */
+    case MCI_CLOSE:
+    case MCI_CLOSE_DRIVER:
+    case MCI_CONFIGURE:
+	size = sizeof(MCI_GENERIC_PARMS);
+	break;
+	/* case MCI_COPY: */
+    case MCI_CUE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_CUE_PARMS);	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_CUE_PARMS);	break;*/	FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+	/* case MCI_CUT:*/
+    case MCI_DELETE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_DELETE_PARMS16);	map = 0x0F1111FB;	break;
+	case MCI_DEVTYPE_WAVEFORM_AUDIO:size = sizeof(MCI_WAVE_DELETE_PARMS);	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+	/* case MCI_ESCAPE: */
+    case MCI_FREEZE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_FREEZE_PARMS);	map = 0x0001111B; 	break;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_RECT_PARMS);	map = 0x0001111B;	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_GETDEVCAPS:
+	keep = TRUE;
+	size = sizeof(MCI_GETDEVCAPS_PARMS);
+	break;
+	/* case MCI_INDEX: */
+    case MCI_INFO:
+	{
+            LPMCI_INFO_PARMSW	mip32w = (LPMCI_INFO_PARMSW)(*lParam);
+            char*               ptr;
+	    LPMCI_INFO_PARMS16	mip16;
+
+	    switch (uDevType) {
+	    case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_INFO_PARMS16);	break;
+	    default:				size = sizeof(MCI_INFO_PARMS16);	break;
+	    }
+            ptr = HeapAlloc( GetProcessHeap(), 0, sizeof(LPMCI_INFO_PARMSW) + size);
+            if (ptr)
+            {
+		*(LPMCI_INFO_PARMSW*)ptr = mip32w;
+		mip16 = (LPMCI_INFO_PARMS16)(ptr + sizeof(LPMCI_INFO_PARMSW));
+		mip16->dwCallback  = mip32w->dwCallback;
+		mip16->lpstrReturn = MapLS( HeapAlloc(GetProcessHeap(), 0, mip32w->dwRetSize / sizeof(WCHAR)) );
+		mip16->dwRetSize   = mip32w->dwRetSize / sizeof(WCHAR);
+		if (uDevType == MCI_DEVTYPE_DIGITAL_VIDEO) {
+		    ((LPMCI_DGV_INFO_PARMS16)mip16)->dwItem = ((LPMCI_DGV_INFO_PARMSW)mip32w)->dwItem;
+		}
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+            *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_INFO_PARMSW);
+	}
+	return WINMM_MAP_OKMEM;
+	/* case MCI_MARK: */
+	/* case MCI_MONITOR: */
+    case MCI_OPEN:
+    case MCI_OPEN_DRIVER:
+	{
+            LPMCI_OPEN_PARMSW	mop32w = (LPMCI_OPEN_PARMSW)(*lParam);
+            char* ptr = HeapAlloc( GetProcessHeap(), 0,
+                                   sizeof(LPMCI_OPEN_PARMSW) + sizeof(MCI_OPEN_PARMS16) + 2 * sizeof(DWORD));
+	    LPMCI_OPEN_PARMS16	mop16;
+
+
+	    if (ptr) {
+		*(LPMCI_OPEN_PARMSW*)(ptr) = mop32w;
+		mop16 = (LPMCI_OPEN_PARMS16)(ptr + sizeof(LPMCI_OPEN_PARMSW));
+		mop16->dwCallback       = mop32w->dwCallback;
+		mop16->wDeviceID        = mop32w->wDeviceID;
+		if (dwFlags & MCI_OPEN_TYPE) {
+		    if (dwFlags & MCI_OPEN_TYPE_ID) {
+			/* dword "transparent" value */
+			mop16->lpstrDeviceType = (SEGPTR)mop32w->lpstrDeviceType;
+		    } else {
+			/* string */
+			mop16->lpstrDeviceType = MapLS( MCI_strdupWtoA(mop32w->lpstrDeviceType) );
+		    }
+		} else {
+		    /* nuthin' */
+		    mop16->lpstrDeviceType = 0;
+		}
+		if (dwFlags & MCI_OPEN_ELEMENT) {
+		    if (dwFlags & MCI_OPEN_ELEMENT_ID) {
+			mop16->lpstrElementName = (SEGPTR)mop32w->lpstrElementName;
+		    } else {
+			mop16->lpstrElementName = MapLS( MCI_strdupWtoA(mop32w->lpstrElementName) );
+		    }
+		} else {
+		    mop16->lpstrElementName = 0;
+		}
+		if (dwFlags & MCI_OPEN_ALIAS) {
+		    mop16->lpstrAlias = MapLS( MCI_strdupWtoA(mop32w->lpstrAlias) );
+		} else {
+		    mop16->lpstrAlias = 0;
+		}
+		/* copy extended information if any...
+		 * FIXME: this may seg fault if initial structure does not contain them and
+		 * the reads after msip16 fail under LDT limits...
+		 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and
+		 * should not take care of extended parameters, and should be used by MCI_Open
+		 * to fetch uDevType. When, this is known, the mapping for sending the
+		 * MCI_OPEN_DRIVER shall be done depending on uDevType.
+		 */
+		memcpy(mop16 + 1, mop32w + 1, 2 * sizeof(DWORD));
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_OPEN_PARMSW);
+	}
+	return WINMM_MAP_OKMEM;
+	/* case MCI_PASTE:*/
+    case MCI_PAUSE:
+	size = sizeof(MCI_GENERIC_PARMS);
+	break;
+    case MCI_PLAY:
+	size = sizeof(MCI_PLAY_PARMS);
+	break;
+    case MCI_PUT:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_RECT_PARMS16);	map = 0x0001111B;	break;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_RECT_PARMS);	map = 0x0001111B;	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_REALIZE:
+	size = sizeof(MCI_GENERIC_PARMS);
+	break;
+    case MCI_RECORD:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_RECORD_PARMS16);	map = 0x0F1111FB;	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_RECORD_PARMS);	break;*/FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	default:			size = sizeof(MCI_RECORD_PARMS);	break;
+	}
+	break;
+    case MCI_RESUME:
+	size = sizeof(MCI_GENERIC_PARMS);
+	break;
+    case MCI_SEEK:
+	switch (uDevType) {
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_SEEK_PARMS);	break;*/FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	default:			size = sizeof(MCI_SEEK_PARMS);		break;
+	}
+	break;
+    case MCI_SET:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_SET_PARMS);	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_SET_PARMS);	break;*/FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	case MCI_DEVTYPE_SEQUENCER:	size = sizeof(MCI_SEQ_SET_PARMS);	break;
+        /* FIXME: normally the 16 and 32 bit structures are byte by byte aligned,
+	 * so not doing anything should work...
+	 */
+	case MCI_DEVTYPE_WAVEFORM_AUDIO:size = sizeof(MCI_WAVE_SET_PARMS);	break;
+	default:			size = sizeof(MCI_SET_PARMS);		break;
+	}
+	break;
+    case MCI_SETAUDIO:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_SETAUDIO_PARMS16);map = 0x0000077FF;	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_SETAUDIO_PARMS);	break;*/FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+	/* case MCI_SETTIMECODE:*/
+	/* case MCI_SIGNAL:*/
+        /* case MCI_SOUND:*/
+    case MCI_SPIN:
+	size = sizeof(MCI_SET_PARMS);
+	break;
+    case MCI_STATUS:
+	keep = TRUE;
+	switch (uDevType) {
+	/* FIXME:
+	 * don't know if buffer for value is the one passed through lpstrDevice
+	 * or is provided by MCI driver.
+	 * Assuming solution 2: provided by MCI driver, so zeroing on entry
+	 */
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_STATUS_PARMS16);	map = 0x0B6FF;		break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_STATUS_PARMS);	break;*/FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	default:			size = sizeof(MCI_STATUS_PARMS);	break;
+	}
+	break;
+    case MCI_STEP:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_STEP_PARMS);	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_STEP_PARMS);	break;*/FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	case MCI_DEVTYPE_VIDEODISC:	size = sizeof(MCI_VD_STEP_PARMS);	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_STOP:
+	size = sizeof(MCI_SET_PARMS);
+	break;
+    case MCI_SYSINFO:
+	{
+            LPMCI_SYSINFO_PARMSW  msip32w = (LPMCI_SYSINFO_PARMSW)(*lParam);
+            LPMCI_SYSINFO_PARMS16 msip16;
+            char* ptr = HeapAlloc( GetProcessHeap(), 0,
+                                   sizeof(LPMCI_SYSINFO_PARMSW) + sizeof(MCI_SYSINFO_PARMS16) );
+
+	    if (ptr) {
+		*(LPMCI_SYSINFO_PARMSW*)(ptr) = msip32w;
+		msip16 = (LPMCI_SYSINFO_PARMS16)(ptr + sizeof(LPMCI_SYSINFO_PARMSW));
+
+		msip16->dwCallback       = msip32w->dwCallback;
+		msip16->lpstrReturn      = MapLS( HeapAlloc(GetProcessHeap(), 0, msip32w->dwRetSize) );
+		msip16->dwRetSize        = msip32w->dwRetSize;
+		msip16->dwNumber         = msip32w->dwNumber;
+		msip16->wDeviceType      = msip32w->wDeviceType;
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_SYSINFO_PARMSW);
+	}
+	return WINMM_MAP_OKMEM;
+	/* case MCI_UNDO: */
+    case MCI_UNFREEZE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_RECT_PARMS16);	map = 0x0001111B;	break;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_RECT_PARMS16);	map = 0x0001111B;	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_UPDATE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_UPDATE_PARMS16);	map = 0x000B1111B;	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_WHERE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_RECT_PARMS16);	map = 0x0001111B;	keep = TRUE;	break;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_RECT_PARMS16);	map = 0x0001111B;	keep = TRUE;	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_WINDOW:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_WINDOW_PARMS16);	if (dwFlags & MCI_DGV_WINDOW_TEXT)  map = 0x7FB;	break;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_WINDOW_PARMS16);	if (dwFlags & MCI_OVLY_WINDOW_TEXT) map = 0x7FB;	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case DRV_OPEN:
+	{
+            LPMCI_OPEN_DRIVER_PARMSW  modp32w = (LPMCI_OPEN_DRIVER_PARMSW)(*lParam);
+            LPMCI_OPEN_DRIVER_PARMS16 modp16;
+            char *ptr = HeapAlloc( GetProcessHeap(), 0,
+                                   sizeof(LPMCI_OPEN_DRIVER_PARMSW) + sizeof(MCI_OPEN_DRIVER_PARMS16));
+
+	    if (ptr) {
+		*(LPMCI_OPEN_DRIVER_PARMSW*)(ptr) = modp32w;
+		modp16 = (LPMCI_OPEN_DRIVER_PARMS16)(ptr + sizeof(LPMCI_OPEN_DRIVER_PARMSW));
+		modp16->wDeviceID = modp32w->wDeviceID;
+		modp16->lpstrParams = MapLS( MCI_strdupWtoA(modp32w->lpstrParams) );
+		/* other fields are gonna be filled by the driver, don't copy them */
+ 	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	    *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_OPEN_DRIVER_PARMSW);
+	}
+	return WINMM_MAP_OKMEM;
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case DRV_CONFIGURE:
+    case DRV_QUERYCONFIGURE:
+    case DRV_INSTALL:
+    case DRV_REMOVE:
+    case DRV_EXITSESSION:
+    case DRV_EXITAPPLICATION:
+    case DRV_POWER:
+	return WINMM_MAP_OK;
+
+    default:
+	FIXME("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg));
+	return WINMM_MAP_MSGERROR;
+    }
+    return MCI_MsgMapper32WTo16_Create((void**)lParam, size, map, keep);
+}
+
+/**************************************************************************
+ * 			MCI_UnMapMsg32WTo16			[internal]
+ */
+static  WINMM_MapType	MCI_UnMapMsg32WTo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD lParam)
+{
+    int		size = 0;
+    BOOLEAN     kept = FALSE;	/* there is no need to compute size when kept is FALSE */
+    DWORD 	map = 0;
+
+    switch (wMsg) {
+    case MCI_BREAK:
+        break;
+	/* case MCI_CAPTURE */
+    case MCI_CLOSE:
+    case MCI_CLOSE_DRIVER:
+    case MCI_CONFIGURE:
+	break;
+	/* case MCI_COPY: */
+    case MCI_CUE:
+	break;
+	/* case MCI_CUT: */
+    case MCI_DELETE:
+	break;
+	/* case MCI_ESCAPE: */
+    case MCI_FREEZE:
+	break;
+    case MCI_GETDEVCAPS:
+	kept = TRUE;
+	size = sizeof(MCI_GETDEVCAPS_PARMS);
+	break;
+	/* case MCI_INDEX: */
+    case MCI_INFO:
+	if (lParam) {
+            LPMCI_INFO_PARMS16  mip16  = (LPMCI_INFO_PARMS16)MapSL(lParam);
+	    LPMCI_INFO_PARMSW   mip32w = *(LPMCI_INFO_PARMSW*)((char*)mip16 - sizeof(LPMCI_INFO_PARMSW));
+
+            MultiByteToWideChar(CP_ACP, 0, MapSL(mip16->lpstrReturn), mip16->dwRetSize, 
+                                mip32w->lpstrReturn, mip32w->dwRetSize / sizeof(WCHAR));
+            UnMapLS( lParam );
+            UnMapLS( mip16->lpstrReturn );
+            HeapFree( GetProcessHeap(), 0, (void*)MapSL(mip16->lpstrReturn) );
+            HeapFree( GetProcessHeap(), 0, (char*)mip16 - sizeof(LPMCI_OPEN_PARMSW) );
+	}
+	return WINMM_MAP_OK;
+	/* case MCI_MARK: */
+	/* case MCI_MONITOR: */
+    case MCI_OPEN:
+    case MCI_OPEN_DRIVER:
+	if (lParam) {
+            LPMCI_OPEN_PARMS16	mop16  = (LPMCI_OPEN_PARMS16)MapSL(lParam);
+	    LPMCI_OPEN_PARMSW	mop32w = *(LPMCI_OPEN_PARMSW*)((char*)mop16 - sizeof(LPMCI_OPEN_PARMSW));
+            UnMapLS( lParam );
+	    mop32w->wDeviceID = mop16->wDeviceID;
+            if ((dwFlags & MCI_OPEN_TYPE) && !(dwFlags & MCI_OPEN_TYPE_ID))
+            {
+                HeapFree(GetProcessHeap(), 0, MapSL(mop16->lpstrDeviceType));
+                UnMapLS( mop16->lpstrDeviceType );
+            }
+            if ((dwFlags & MCI_OPEN_ELEMENT) && !(dwFlags & MCI_OPEN_ELEMENT_ID))
+            {
+                HeapFree(GetProcessHeap(), 0, MapSL(mop16->lpstrElementName));
+                UnMapLS( mop16->lpstrElementName );
+            }
+            if (dwFlags & MCI_OPEN_ALIAS)
+            {
+                HeapFree(GetProcessHeap(), 0, MapSL(mop16->lpstrAlias));
+                UnMapLS( mop16->lpstrAlias );
+            }
+            HeapFree( GetProcessHeap(), 0, (char*)mop16 - sizeof(LPMCI_OPEN_PARMSW) );
+	}
+	return WINMM_MAP_OK;
+	/* case MCI_PASTE:*/
+    case MCI_PAUSE:
+	break;
+    case MCI_PLAY:
+	break;
+    case MCI_PUT:
+	break;
+    case MCI_REALIZE:
+	break;
+    case MCI_RECORD:
+	break;
+    case MCI_RESUME:
+	break;
+    case MCI_SEEK:
+	break;
+    case MCI_SET:
+	break;
+    case MCI_SETAUDIO:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	map = 0x0000077FF;	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_SETAUDIO_PARMS);	break;*/FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	}
+	break;
+	/* case MCI_SETTIMECODE:*/
+	/* case MCI_SIGNAL:*/
+        /* case MCI_SOUND:*/
+    case MCI_SPIN:
+	break;
+    case MCI_STATUS:
+	kept = TRUE;
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:
+	if (lParam) {
+            LPMCI_DGV_STATUS_PARMS16	mdsp16  = (LPMCI_DGV_STATUS_PARMS16)MapSL(lParam);
+	    LPMCI_DGV_STATUS_PARMSA	mdsp32a = *(LPMCI_DGV_STATUS_PARMSA*)((char*)mdsp16 - sizeof(LPMCI_DGV_STATUS_PARMSA));
+
+            UnMapLS( lParam );
+	    if (mdsp16) {
+		mdsp32a->dwReturn = mdsp16->dwReturn;
+		if (dwFlags & MCI_DGV_STATUS_DISKSPACE) {
+		    TRACE("MCI_STATUS (DGV) lpstrDrive=%08lx\n", mdsp16->lpstrDrive);
+		    TRACE("MCI_STATUS (DGV) lpstrDrive=%s\n", (LPSTR)MapSL(mdsp16->lpstrDrive));
+                    UnMapLS( mdsp16->lpstrDrive );
+		}
+                HeapFree( GetProcessHeap(), 0, (char*)mdsp16 - sizeof(LPMCI_DGV_STATUS_PARMSA) );
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	}
+	return WINMM_MAP_OKMEM;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_STATUS_PARMS);	break;*/FIXME("NIY vcr\n");	return WINMM_MAP_NOMEM;
+	default:			size = sizeof(MCI_STATUS_PARMS);	break;
+	}
+	break;
+    case MCI_STEP:
+	break;
+    case MCI_STOP:
+	break;
+    case MCI_SYSINFO:
+	if (lParam) {
+            LPMCI_SYSINFO_PARMS16	msip16  = (LPMCI_SYSINFO_PARMS16)MapSL(lParam);
+	    LPMCI_SYSINFO_PARMSW	msip32w = *(LPMCI_SYSINFO_PARMSW*)((char*)msip16 - sizeof(LPMCI_SYSINFO_PARMSW));
+
+            UnMapLS( lParam );
+	    if (msip16) {
+                MultiByteToWideChar(CP_ACP, 0, MapSL(msip16->lpstrReturn), msip16->dwRetSize, 
+                                    msip32w->lpstrReturn, msip32w->dwRetSize);
+                UnMapLS( msip16->lpstrReturn );
+                HeapFree( GetProcessHeap(), 0, MapSL(msip16->lpstrReturn) );
+                HeapFree( GetProcessHeap(), 0, (char*)msip16 - sizeof(LPMCI_SYSINFO_PARMSW) );
+	    } else {
+		return WINMM_MAP_NOMEM;
+	    }
+	}
+	return WINMM_MAP_OKMEM;
+	/* case MCI_UNDO: */
+    case MCI_UNFREEZE:
+	break;
+    case MCI_UPDATE:
+	break;
+    case MCI_WHERE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_RECT_PARMS16);	map = 0x0001111B;	kept = TRUE;	break;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_RECT_PARMS16);	map = 0x0001111B;	kept = TRUE;	break;
+	default:			break;
+	}
+	break;
+    case MCI_WINDOW:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_WINDOW_PARMS16);	if (dwFlags & MCI_DGV_WINDOW_TEXT)  map = 0x7666;	break;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_WINDOW_PARMS16);	if (dwFlags & MCI_OVLY_WINDOW_TEXT) map = 0x7666;	break;
+	default:			break;
+	}
+	/* FIXME: see map function */
+	break;
+    case DRV_OPEN:
+	if (lParam) {
+            LPMCI_OPEN_DRIVER_PARMS16	modp16  = (LPMCI_OPEN_DRIVER_PARMS16)MapSL(lParam);
+	    LPMCI_OPEN_DRIVER_PARMSW	modp32w = *(LPMCI_OPEN_DRIVER_PARMSW*)((char*)modp16 - sizeof(LPMCI_OPEN_DRIVER_PARMSW));
+
+            UnMapLS( lParam );
+	    modp32w->wCustomCommandTable = modp16->wCustomCommandTable;
+	    modp32w->wType = modp16->wType;
+            HeapFree(GetProcessHeap(), 0, MapSL(modp16->lpstrParams));
+            UnMapLS( modp16->lpstrParams );
+            HeapFree( GetProcessHeap(), 0, (char *)modp16 - sizeof(LPMCI_OPEN_DRIVER_PARMSW) );
+	}
+	return WINMM_MAP_OK;
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case DRV_CONFIGURE:
+    case DRV_QUERYCONFIGURE:
+    case DRV_INSTALL:
+    case DRV_REMOVE:
+    case DRV_EXITSESSION:
+    case DRV_EXITAPPLICATION:
+    case DRV_POWER:
+	FIXME("This is a hack\n");
+	return WINMM_MAP_OK;
+
+    default:
+	FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg));
+	return WINMM_MAP_MSGERROR;
+    }
+    return MCI_MsgMapper32WTo16_Destroy((void*)lParam, size, map, kept);
 }
 
 void    MMDRV_Init16(void)
 {
 #define A(_x,_y) MMDRV_InstallMap(_x, \
-MMDRV_##_y##_Map16To32A, MMDRV_##_y##_UnMap16To32A, \
-MMDRV_##_y##_Map32ATo16, MMDRV_##_y##_UnMap32ATo16, \
+MMDRV_##_y##_Map16To32W, MMDRV_##_y##_UnMap16To32W, \
+MMDRV_##_y##_Map32WTo16, MMDRV_##_y##_UnMap32WTo16, \
 MMDRV_##_y##_Callback)
     A(MMDRV_AUX,        Aux);
     A(MMDRV_MIXER,      Mixer);
@@ -2794,8 +3521,8 @@
     pFnCallMMDrvFunc16 = MMDRV_CallMMDrvFunc16;
     pFnLoadMMDrvFunc16 = MMDRV_LoadMMDrvFunc16;
 
-    pFnMciMapMsg16To32A   = MCI_MapMsg16To32A;
-    pFnMciUnMapMsg16To32A = MCI_UnMapMsg16To32A;
-    pFnMciMapMsg32ATo16   = MCI_MapMsg32ATo16;
-    pFnMciUnMapMsg32ATo16 = MCI_UnMapMsg32ATo16;
+    pFnMciMapMsg16To32W   = MCI_MapMsg16To32W;
+    pFnMciUnMapMsg16To32W = MCI_UnMapMsg16To32W;
+    pFnMciMapMsg32WTo16   = MCI_MapMsg32WTo16;
+    pFnMciUnMapMsg32WTo16 = MCI_UnMapMsg32WTo16;
 }
diff --git a/dlls/winmm/mmio.c b/dlls/winmm/mmio.c
index 673ed39..ba44606 100644
--- a/dlls/winmm/mmio.c
+++ b/dlls/winmm/mmio.c
@@ -1,4 +1,3 @@
-/* -*- tab-width: 8; c-basic-offset: 4 -*- */
 /*
  * MMIO functions
  *
@@ -221,8 +220,6 @@
 	FIXME("unexpected message %u\n", uMessage);
 	return 0;
     }
-
-    return 0;
 }
 
 /* This array will be the entire list for most apps 
@@ -1351,7 +1348,7 @@
     /* FIXME: should we actually pass lpmmioinfo down the drain ???
      * or make a copy of it because it's const ???
      */
-    return send_message(ioProc, (LPMMIOINFO)lpmmioinfo, MMIOM_RENAME,
+    return send_message(ioProc, (MMIOINFO*)lpmmioinfo, MMIOM_RENAME,
                         (LPARAM)szFileName, (LPARAM)szNewFileName, MMIO_PROC_32A);
 }
 
diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c
index 02e34c0..3fd754f 100644
--- a/dlls/winmm/mmsystem.c
+++ b/dlls/winmm/mmsystem.c
@@ -48,7 +48,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(mmsys);
 
 static WINE_MMTHREAD*   WINMM_GetmmThread(HANDLE16);
-static LPWINE_DRIVER    DRIVER_OpenDriver16(LPCSTR, LPCSTR, LPARAM);
+static LPWINE_DRIVER    DRIVER_OpenDriver16(LPCWSTR, LPCWSTR, LPARAM);
 static LRESULT          DRIVER_CloseDriver16(HDRVR16, LPARAM, LPARAM);
 static LRESULT          DRIVER_SendMessage16(HDRVR16, UINT, LPARAM, LPARAM);
 static LRESULT          MMIO_Callback16(SEGPTR, LPMMIOINFO, UINT, LPARAM, LPARAM);
@@ -597,7 +597,7 @@
 {
     TRACE("(\"%s\")\n", lpstrName);
 
-    return MCI_GetDriverFromString(lpstrName);
+    return mciGetDeviceIDA(lpstrName);
 }
 
 /**************************************************************************
@@ -731,6 +731,7 @@
 
 /**************************************************************************
  * 				midiOutGetErrorText 	[MMSYSTEM.203]
+ * 				midiInGetErrorText 	[MMSYSTEM.203]
  */
 UINT16 WINAPI midiOutGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
@@ -949,14 +950,6 @@
 }
 
 /**************************************************************************
- * 				midiInGetErrorText 		[MMSYSTEM.303]
- */
-UINT16 WINAPI midiInGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize)
-{
-    return midiInGetErrorTextA(uError, lpText, uSize);
-}
-
-/**************************************************************************
  * 				midiInOpen		[MMSYSTEM.304]
  */
 UINT16 WINAPI midiInOpen16(HMIDIIN16* lphMidiIn, UINT16 uDeviceID,
@@ -1238,6 +1231,7 @@
 
 /**************************************************************************
  * 				waveOutGetErrorText 	[MMSYSTEM.403]
+ * 				waveInGetErrorText 	[MMSYSTEM.403]
  */
 UINT16 WINAPI waveOutGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
@@ -1536,14 +1530,6 @@
 }
 
 /**************************************************************************
- * 				waveInGetErrorText 	[MMSYSTEM.503]
- */
-UINT16 WINAPI waveInGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize)
-{
-    return waveInGetErrorTextA(uError, lpText, uSize);
-}
-
-/**************************************************************************
  * 				waveInOpen			[MMSYSTEM.504]
  */
 UINT16 WINAPI waveInOpen16(HWAVEIN16* lphWaveIn, UINT16 uDeviceID,
@@ -2371,30 +2357,52 @@
  *
  * Tries to load a 16 bit driver whose DLL's (module) name is lpFileName.
  */
-static	LPWINE_DRIVER	DRIVER_OpenDriver16(LPCSTR fn, LPCSTR sn, LPARAM lParam2)
+static	LPWINE_DRIVER	DRIVER_OpenDriver16(LPCWSTR fn, LPCWSTR sn, LPARAM lParam2)
 {
     LPWINE_DRIVER 	lpDrv = NULL;
-    LPCSTR		cause = 0;
+    LPCSTR		cause = NULL;
+    LPSTR               fnA = NULL, snA = NULL;
+    unsigned            len;
 
-    TRACE("(%s, %08lX);\n", debugstr_a(sn), lParam2);
+    TRACE("(%s, %s, %08lX);\n", debugstr_w(fn), debugstr_w(sn), lParam2);
 
     lpDrv = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_DRIVER));
     if (lpDrv == NULL) {cause = "OOM"; goto exit;}
 
+    if (fn)
+    {
+        len = WideCharToMultiByte( CP_ACP, 0, fn, -1, NULL, 0, NULL, NULL );
+        fnA = HeapAlloc(GetProcessHeap(), 0, len);
+        if (fnA == NULL) {cause = "OOM"; goto exit;}
+        WideCharToMultiByte( CP_ACP, 0, fn, -1, fnA, len, NULL, NULL );
+    }
+
+    if (sn)
+    {
+        len = WideCharToMultiByte( CP_ACP, 0, sn, -1, NULL, 0, NULL, NULL );
+        snA = HeapAlloc(GetProcessHeap(), 0, len);
+        if (snA == NULL) {cause = "OOM"; goto exit;}
+        WideCharToMultiByte( CP_ACP, 0, sn, -1, snA, len, NULL, NULL );
+    }
+
     /* FIXME: shall we do some black magic here on sn ?
      *	drivers32 => drivers
      *	mci32 => mci
      * ...
      */
-    lpDrv->d.d16.hDriver16 = OpenDriver16(fn, sn, lParam2);
+    lpDrv->d.d16.hDriver16 = OpenDriver16(fnA, snA, lParam2);
     if (lpDrv->d.d16.hDriver16 == 0) {cause = "Not a 16 bit driver"; goto exit;}
     lpDrv->dwFlags = WINE_GDF_16BIT;
 
     TRACE("=> %p\n", lpDrv);
     return lpDrv;
- exit:
+
+exit:
     HeapFree(GetProcessHeap(), 0, lpDrv);
-    TRACE("Unable to load 16 bit module %s: %s\n", debugstr_a(fn), cause);
+    HeapFree(GetProcessHeap(), 0, fnA);
+    HeapFree(GetProcessHeap(), 0, snA);
+    TRACE("Unable to load 16 bit module %s[%s]: %s\n", 
+          debugstr_w(fn), debugstr_w(sn), cause);
     return NULL;
 }
 
@@ -2612,15 +2620,45 @@
  */
 UINT16 WINAPI mciLoadCommandResource16(HINSTANCE16 hInst, LPCSTR resname, UINT16 type)
 {
-    HRSRC16 res;
-    HGLOBAL16 handle;
-    void *ptr;
+    HRSRC16     res;
+    HGLOBAL16   handle;
+    const BYTE* ptr16;
+    BYTE*       ptr32;
+    unsigned    pos = 0, size = 1024, len;
+    const char* str;
+    DWORD	flg;
+    WORD	eid;
+    UINT16      ret = MCIERR_OUT_OF_MEMORY;
 
     if (!(res = FindResource16( hInst, resname, (LPSTR)RT_RCDATA))) return MCI_NO_COMMAND_TABLE;
     if (!(handle = LoadResource16( hInst, res ))) return MCI_NO_COMMAND_TABLE;
-    ptr = LockResource16(handle);
-    return MCI_SetCommandTable(ptr, type);
-    /* FIXME: FreeResource */
+    ptr16 = LockResource16(handle);
+    /* converting the 16 bit resource table into a 32W one */
+    if ((ptr32 = HeapAlloc(GetProcessHeap(), 0, size)))
+    {
+        do {
+            str = (LPCSTR)ptr16;
+            ptr16 += strlen(str) + 1;
+            flg = *(const DWORD*)ptr16;
+            eid = *(const WORD*)(ptr16 + sizeof(DWORD));
+            ptr16 += sizeof(DWORD) + sizeof(WORD);
+            len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0) * sizeof(WCHAR);
+            if (pos + len + sizeof(DWORD) + sizeof(WORD) > size)
+            {
+                while (pos + len * sizeof(WCHAR) + sizeof(DWORD) + sizeof(WORD) > size) size += 1024;
+                ptr32 = HeapReAlloc(GetProcessHeap(), 0, ptr32, size);
+                if (!ptr32) goto the_end;
+            }
+            MultiByteToWideChar(CP_ACP, 0, str, -1, (LPWSTR)(ptr32 + pos), len / sizeof(WCHAR));
+            *(DWORD*)(ptr32 + pos + len) = flg;
+            *(WORD*)(ptr32 + pos + len + sizeof(DWORD)) = eid;
+            pos += len + sizeof(DWORD) + sizeof(WORD);
+        } while (eid != MCI_END_COMMAND_LIST);
+    }
+the_end:
+    FreeResource16( handle );
+    if (ptr32) ret = MCI_SetCommandTable(ptr32, type);
+    return ret;
 }
 
 /**************************************************************************
@@ -2630,7 +2668,7 @@
 {
     TRACE("(%04x)!\n", uTable);
 
-    return mciFreeCommandResource(uTable);
+    return MCI_DeleteCommandTable(uTable, TRUE);
 }
 
 /* ###################################################
diff --git a/dlls/winmm/mmsystem.spec b/dlls/winmm/mmsystem.spec
index e260dd0..502f401 100644
--- a/dlls/winmm/mmsystem.spec
+++ b/dlls/winmm/mmsystem.spec
@@ -45,7 +45,7 @@
 257    pascal  midiStreamStop(word) midiStreamStop16
 301    pascal  midiInGetNumDevs() midiInGetNumDevs16
 302    pascal  midiInGetDevCaps(word ptr word) midiInGetDevCaps16
-303    pascal  midiInGetErrorText(word ptr word) midiInGetErrorText16
+303    pascal  midiInGetErrorText(word ptr word) midiOutGetErrorText16
 304    pascal  midiInOpen(ptr word long long long) midiInOpen16
 305    pascal  midiInClose(word) midiInClose16
 306    pascal  midiInPrepareHeader(word segptr word) midiInPrepareHeader16
@@ -84,7 +84,7 @@
 421    pascal  waveOutMessage(word word long long) waveOutMessage16
 501    pascal  waveInGetNumDevs() waveInGetNumDevs16
 502    pascal  waveInGetDevCaps(word ptr word) waveInGetDevCaps16
-503    pascal  waveInGetErrorText(word ptr word) waveInGetErrorText16
+503    pascal  waveInGetErrorText(word ptr word) waveOutGetErrorText16
 504    pascal  waveInOpen(ptr word ptr long long long) waveInOpen16
 505    pascal  waveInClose(word) waveInClose16
 506    pascal  waveInPrepareHeader(word segptr word) waveInPrepareHeader16
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h
index 3c3741c..a558c76 100644
--- a/dlls/winmm/winemm.h
+++ b/dlls/winmm/winemm.h
@@ -87,7 +87,7 @@
 typedef struct tagWINE_MM_DRIVER {
     HDRVR			hDriver;
     LPSTR			drvname;	/* name of the driver */
-    BOOL			bIs32 : 1,	/* TRUE if 32 bit driver, FALSE for 16 */
+    unsigned			bIs32 : 1,	/* TRUE if 32 bit driver, FALSE for 16 */
 	                        bIsMapper : 1;	/* TRUE if mapper */
     WINE_MM_DRIVER_PART		parts[MMDRV_MAX];/* Information for all known types */
 } WINE_MM_DRIVER, *LPWINE_MM_DRIVER;
@@ -139,9 +139,9 @@
 typedef struct tagWINE_MCIDRIVER {
         UINT			wDeviceID;
         UINT			wType;
-	LPSTR			lpstrElementName;
-        LPSTR			lpstrDeviceType;
-        LPSTR			lpstrAlias;
+	LPWSTR			lpstrElementName;
+        LPWSTR			lpstrDeviceType;
+        LPWSTR			lpstrAlias;
         HDRVR			hDriver;
 	DWORD			dwPrivate;
         YIELDPROC		lpfnYieldProc;
@@ -181,14 +181,14 @@
     MMIOINFO			info;
     struct tagWINE_MMIO*	lpNext;
     struct IOProcList*		ioProc;
-    BOOL			bTmpIOProc : 1,
+    unsigned			bTmpIOProc : 1,
                                 bBufferLoaded : 1;
     DWORD                       segBuffer16;
     DWORD                       dwFileSize;
 } WINE_MMIO, *LPWINE_MMIO;
 
 typedef struct tagWINE_PLAYSOUND {
-    BOOL                        bLoop : 1,
+    unsigned                    bLoop : 1,
                                 bAlloc : 1;
     LPCWSTR		        pszSound;
     HMODULE		        hMod;
@@ -223,8 +223,8 @@
 typedef	WINMM_MapType	        (*MMDRV_UNMAPFUNC)(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT ret);
 
 LPWINE_DRIVER	DRIVER_FindFromHDrvr(HDRVR hDrvr);
-BOOL		DRIVER_GetLibName(LPCSTR keyName, LPCSTR sectName, LPSTR buf, int sz);
-LPWINE_DRIVER	DRIVER_TryOpenDriver32(LPCSTR fn, LPARAM lParam2);
+BOOL		DRIVER_GetLibName(LPCWSTR keyName, LPCWSTR sectName, LPWSTR buf, int sz);
+LPWINE_DRIVER	DRIVER_TryOpenDriver32(LPCWSTR fn, LPARAM lParam2);
 void            DRIVER_UnloadAll(void);
 
 BOOL		MMDRV_Init(void);
@@ -244,15 +244,18 @@
                                  MMDRV_MAPFUNC, MMDRV_UNMAPFUNC, LPDRVCALLBACK);
 
 WINE_MCIDRIVER* MCI_GetDriver(UINT16 uDevID);
-UINT		MCI_GetDriverFromString(LPCSTR str);
-DWORD		MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr);
-const char* 	MCI_MessageToString(UINT16 wMsg);
+UINT		MCI_GetDriverFromString(LPCWSTR str);
+DWORD		MCI_WriteString(LPWSTR lpDstStr, DWORD dstSize, LPCWSTR lpSrcStr);
+const char* 	MCI_MessageToString(UINT wMsg);
 UINT	WINAPI	MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data);
 LRESULT		MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2);
 DWORD		MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32);
 DWORD		MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
 DWORD		MCI_SendCommandFrom16(UINT wDevID, UINT16 wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
 UINT		MCI_SetCommandTable(void *table, UINT uDevType);
+BOOL	        MCI_DeleteCommandTable(UINT uTbl, BOOL delete);
+LPWSTR          MCI_strdupAtoW(LPCSTR str);
+LPSTR           MCI_strdupWtoA(LPCWSTR str);
 
 BOOL            WINMM_CheckForMMSystem(void);
 const char*     WINMM_ErrorToString(MMRESULT error);
@@ -290,13 +293,13 @@
  * NULL otherwise
  */
 extern  WINE_MMTHREAD*  (*pFnGetMMThread16)(UINT16);
-extern  LPWINE_DRIVER   (*pFnOpenDriver16)(LPCSTR,LPCSTR,LPARAM);
+extern  LPWINE_DRIVER   (*pFnOpenDriver16)(LPCWSTR,LPCWSTR,LPARAM);
 extern  LRESULT         (*pFnCloseDriver16)(UINT16,LPARAM,LPARAM);
 extern  LRESULT         (*pFnSendMessage16)(UINT16,UINT,LPARAM,LPARAM);
-extern  WINMM_MapType   (*pFnMciMapMsg16To32A)(WORD,WORD,DWORD*);
-extern  WINMM_MapType   (*pFnMciUnMapMsg16To32A)(WORD,WORD,DWORD);
-extern  WINMM_MapType   (*pFnMciMapMsg32ATo16)(WORD,WORD,DWORD,DWORD*);
-extern  WINMM_MapType   (*pFnMciUnMapMsg32ATo16)(WORD,WORD,DWORD,DWORD);
+extern  WINMM_MapType   (*pFnMciMapMsg16To32W)(WORD,WORD,DWORD*);
+extern  WINMM_MapType   (*pFnMciUnMapMsg16To32W)(WORD,WORD,DWORD);
+extern  WINMM_MapType   (*pFnMciMapMsg32WTo16)(WORD,WORD,DWORD,DWORD*);
+extern  WINMM_MapType   (*pFnMciUnMapMsg32WTo16)(WORD,WORD,DWORD,DWORD);
 extern  LRESULT         (*pFnCallMMDrvFunc16)(DWORD /* in fact FARPROC16 */,WORD,WORD,LONG,LONG,LONG);
 extern  unsigned        (*pFnLoadMMDrvFunc16)(LPCSTR,LPWINE_DRIVER, LPWINE_MM_DRIVER);
 extern  LRESULT         (*pFnMmioCallback16)(DWORD,LPMMIOINFO,UINT,LPARAM,LPARAM);
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 69ca68f..5c2f3a7 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -53,27 +53,11 @@
 #include "winreg.h"
 #include "winternl.h"
 #include "winemm.h"
-#include "wownt32.h"
 
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(winmm);
 
-/******************************************************************
- *		MyUserYield
- *
- * Internal wrapper to call USER.UserYield16 (in fact through a Wine only export from USER32).
- */
-static void MyUserYield(void)
-{
-    HMODULE mod = GetModuleHandleA( "user32.dll" );
-    if (mod)
-    {
-        FARPROC proc = GetProcAddress( mod, "UserYield16" );
-        if (proc) proc();
-    }
-}
-
 void    (WINAPI *pFnReleaseThunkLock)(DWORD*);
 void    (WINAPI *pFnRestoreThunkLock)(DWORD);
 
@@ -776,469 +760,6 @@
 }
 
 /**************************************************************************
- * 				mciGetErrorStringW		[WINMM.@]
- */
-BOOL WINAPI mciGetErrorStringW(MCIERROR wError, LPWSTR lpstrBuffer, UINT uLength)
-{
-    char       bufstr[MAXERRORLENGTH];
-    BOOL       ret = mciGetErrorStringA(wError, bufstr, MAXERRORLENGTH);
-
-    MultiByteToWideChar( CP_ACP, 0, bufstr, -1, lpstrBuffer, uLength );
-    return ret;
-}
-
-/**************************************************************************
- * 				mciGetErrorStringA		[WINMM.@]
- */
-BOOL WINAPI mciGetErrorStringA(MCIERROR dwError, LPSTR lpstrBuffer, UINT uLength)
-{
-    BOOL		ret = FALSE;
-
-    if (lpstrBuffer != NULL && uLength > 0 &&
-	dwError >= MCIERR_BASE && dwError <= MCIERR_CUSTOM_DRIVER_BASE) {
-
-	if (LoadStringA(WINMM_IData->hWinMM32Instance,
-			dwError, lpstrBuffer, uLength) > 0) {
-	    ret = TRUE;
-	}
-    }
-    return ret;
-}
-
-/**************************************************************************
- *			mciDriverNotify				[WINMM.@]
- */
-BOOL WINAPI mciDriverNotify(HWND hWndCallBack, MCIDEVICEID wDevID, UINT wStatus)
-{
-    TRACE("(%p, %04x, %04X)\n", hWndCallBack, wDevID, wStatus);
-
-    return PostMessageW(hWndCallBack, MM_MCINOTIFY, wStatus, wDevID);
-}
-
-/**************************************************************************
- * 			mciGetDriverData			[WINMM.@]
- */
-DWORD WINAPI mciGetDriverData(MCIDEVICEID uDeviceID)
-{
-    LPWINE_MCIDRIVER	wmd;
-
-    TRACE("(%04x)\n", uDeviceID);
-
-    wmd = MCI_GetDriver(uDeviceID);
-
-    if (!wmd) {
-	WARN("Bad uDeviceID\n");
-	return 0L;
-    }
-
-    return wmd->dwPrivate;
-}
-
-/**************************************************************************
- * 			mciSetDriverData			[WINMM.@]
- */
-BOOL WINAPI mciSetDriverData(MCIDEVICEID uDeviceID, DWORD data)
-{
-    LPWINE_MCIDRIVER	wmd;
-
-    TRACE("(%04x, %08lx)\n", uDeviceID, data);
-
-    wmd = MCI_GetDriver(uDeviceID);
-
-    if (!wmd) {
-	WARN("Bad uDeviceID\n");
-	return FALSE;
-    }
-
-    wmd->dwPrivate = data;
-    return TRUE;
-}
-
-/**************************************************************************
- * 				mciSendCommandA			[WINMM.@]
- */
-DWORD WINAPI mciSendCommandA(MCIDEVICEID wDevID, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
-{
-    DWORD	dwRet;
-
-    TRACE("(%08x, %s, %08lx, %08lx)\n",
-	  wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2);
-
-    dwRet = MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2, TRUE);
-    dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2);
-    TRACE("=> %08lx\n", dwRet);
-    return dwRet;
-}
-
-inline static LPSTR strdupWtoA( LPCWSTR str )
-{
-    LPSTR ret;
-    INT len;
-
-    if (!str) return NULL;
-    len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
-    ret = HeapAlloc( GetProcessHeap(), 0, len );
-    if(ret) WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL );
-    return ret;
-}
-
-static int MCI_MapMsgWtoA(UINT msg, DWORD_PTR dwParam1, DWORD_PTR *dwParam2)
-{
-    switch(msg)
-    {
-    case MCI_CLOSE:
-    case MCI_PLAY:
-    case MCI_SEEK:
-    case MCI_STOP:
-    case MCI_PAUSE:
-    case MCI_GETDEVCAPS:
-    case MCI_SPIN:
-    case MCI_SET:
-    case MCI_STEP:
-    case MCI_RECORD:
-    case MCI_BREAK:
-    case MCI_SOUND:
-    case MCI_STATUS:
-    case MCI_CUE:
-    case MCI_REALIZE:
-    case MCI_PUT:
-    case MCI_WHERE:
-    case MCI_FREEZE:
-    case MCI_UNFREEZE:
-    case MCI_CUT:
-    case MCI_COPY:
-    case MCI_PASTE:
-    case MCI_UPDATE:
-    case MCI_RESUME:
-    case MCI_DELETE:
-        return 0;
-
-    case MCI_OPEN:
-        {
-            MCI_OPEN_PARMSW *mci_openW = (MCI_OPEN_PARMSW *)*dwParam2;
-            MCI_OPEN_PARMSA *mci_openA;
-            DWORD_PTR *ptr;
-
-            ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_openA) + sizeof(DWORD_PTR));
-            if (!ptr) return -1;
-
-            *ptr++ = *dwParam2; /* save the previous pointer */
-            *dwParam2 = (DWORD_PTR)ptr;
-            mci_openA = (MCI_OPEN_PARMSA *)ptr;
-
-            if (dwParam1 & MCI_NOTIFY)
-                mci_openA->dwCallback = mci_openW->dwCallback;
-
-            if (dwParam1 & MCI_OPEN_TYPE)
-            {
-                if (dwParam1 & MCI_OPEN_TYPE_ID)
-                    mci_openA->lpstrDeviceType = (LPSTR)mci_openW->lpstrDeviceType;
-                else
-                    mci_openA->lpstrDeviceType = strdupWtoA(mci_openW->lpstrDeviceType);
-            }
-            if (dwParam1 & MCI_OPEN_ELEMENT)
-            {
-                if (dwParam1 & MCI_OPEN_ELEMENT_ID)
-                    mci_openA->lpstrElementName = (LPSTR)mci_openW->lpstrElementName;
-                else
-                    mci_openA->lpstrElementName = strdupWtoA(mci_openW->lpstrElementName);
-            }
-            if (dwParam1 & MCI_OPEN_ALIAS)
-                mci_openA->lpstrAlias = strdupWtoA(mci_openW->lpstrAlias);
-        }
-        return 1;
-
-    case MCI_WINDOW:
-        if (dwParam1 & MCI_ANIM_WINDOW_TEXT)
-        {
-            MCI_ANIM_WINDOW_PARMSW *mci_windowW = (MCI_ANIM_WINDOW_PARMSW *)*dwParam2;
-            MCI_ANIM_WINDOW_PARMSA *mci_windowA;
-
-            mci_windowA = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_windowA));
-            if (!mci_windowA) return -1;
-
-            *dwParam2 = (DWORD_PTR)mci_windowA;
-
-            mci_windowA->lpstrText = strdupWtoA(mci_windowW->lpstrText);
-
-            if (dwParam1 & MCI_NOTIFY)
-                mci_windowA->dwCallback = mci_windowW->dwCallback;
-            if (dwParam1 & MCI_ANIM_WINDOW_HWND)
-                mci_windowA->hWnd = mci_windowW->hWnd;
-            if (dwParam1 & MCI_ANIM_WINDOW_STATE)
-                mci_windowA->nCmdShow = mci_windowW->nCmdShow;
-
-            return 1;
-        }
-        return 0;
-
-    case MCI_SYSINFO:
-        {
-            MCI_SYSINFO_PARMSW *mci_sysinfoW = (MCI_SYSINFO_PARMSW *)*dwParam2;
-            MCI_SYSINFO_PARMSA *mci_sysinfoA;
-            DWORD_PTR *ptr;
-
-            ptr = HeapAlloc(GetProcessHeap(), 0, sizeof(*mci_sysinfoA) + sizeof(DWORD_PTR));
-            if (!ptr) return -1;
-
-            *ptr++ = *dwParam2; /* save the previous pointer */
-            *dwParam2 = (DWORD_PTR)ptr;
-            mci_sysinfoA = (MCI_SYSINFO_PARMSA *)ptr;
-
-            if (dwParam1 & MCI_NOTIFY)
-                mci_sysinfoA->dwCallback = mci_sysinfoW->dwCallback;
-
-            mci_sysinfoA->dwRetSize = mci_sysinfoW->dwRetSize; /* FIXME */
-            mci_sysinfoA->lpstrReturn = HeapAlloc(GetProcessHeap(), 0, mci_sysinfoA->dwRetSize);
-
-            return 1;
-        }
-
-    case MCI_INFO:
-    case MCI_SAVE:
-    case MCI_LOAD:
-    case MCI_ESCAPE:
-    default:
-        FIXME("Message 0x%04x needs translation\n", msg);
-        return -1;
-    }
-}
-
-static DWORD MCI_UnmapMsgWtoA(UINT msg, DWORD_PTR dwParam1, DWORD_PTR dwParam2,
-                              DWORD result)
-{
-    switch(msg)
-    {
-    case MCI_OPEN:
-        {
-            DWORD_PTR *ptr = (DWORD_PTR *)dwParam2 - 1;
-            MCI_OPEN_PARMSW *mci_openW = (MCI_OPEN_PARMSW *)*ptr;
-            MCI_OPEN_PARMSA *mci_openA = (MCI_OPEN_PARMSA *)(ptr + 1);
-
-            mci_openW->wDeviceID = mci_openA->wDeviceID;
-
-            if (dwParam1 & MCI_OPEN_TYPE)
-            {
-                if (!(dwParam1 & MCI_OPEN_TYPE_ID))
-                    HeapFree(GetProcessHeap(), 0, mci_openA->lpstrDeviceType);
-            }
-            if (dwParam1 & MCI_OPEN_ELEMENT)
-            {
-                if (!(dwParam1 & MCI_OPEN_ELEMENT_ID))
-                    HeapFree(GetProcessHeap(), 0, mci_openA->lpstrElementName);
-            }
-            if (dwParam1 & MCI_OPEN_ALIAS)
-                HeapFree(GetProcessHeap(), 0, mci_openA->lpstrAlias);
-            HeapFree(GetProcessHeap(), 0, ptr);
-        }
-        break;
-
-    case MCI_WINDOW:
-        if (dwParam1 & MCI_ANIM_WINDOW_TEXT)
-        {
-            MCI_ANIM_WINDOW_PARMSA *mci_windowA = (MCI_ANIM_WINDOW_PARMSA *)dwParam2;
-
-            HeapFree(GetProcessHeap(), 0, (void *)mci_windowA->lpstrText);
-            HeapFree(GetProcessHeap(), 0, mci_windowA);
-        }
-        break;
-
-    case MCI_SYSINFO:
-        {
-            DWORD_PTR *ptr = (DWORD_PTR *)dwParam2 - 1;
-            MCI_SYSINFO_PARMSW *mci_sysinfoW = (MCI_SYSINFO_PARMSW *)*ptr;
-            MCI_SYSINFO_PARMSA *mci_sysinfoA = (MCI_SYSINFO_PARMSA *)(ptr + 1);
-
-            if (!result)
-            {
-                mci_sysinfoW->dwNumber = mci_sysinfoA->dwNumber;
-                mci_sysinfoW->wDeviceType = mci_sysinfoA->wDeviceType;
-                MultiByteToWideChar(CP_ACP, 0,
-                                    mci_sysinfoA->lpstrReturn, mci_sysinfoA->dwRetSize,
-                                    mci_sysinfoW->lpstrReturn, mci_sysinfoW->dwRetSize);
-            }
-
-            HeapFree(GetProcessHeap(), 0, mci_sysinfoA->lpstrReturn);
-            HeapFree(GetProcessHeap(), 0, ptr);
-        }
-        break;
-
-    default:
-        FIXME("Message 0x%04x needs unmapping\n", msg);
-        break;
-    }
-
-    return result;
-}
-
-
-/**************************************************************************
- * 				mciSendCommandW			[WINMM.@]
- *
- * FIXME: we should do the things other way around, but since our
- * MM subsystem is not unicode aware...
- */
-DWORD WINAPI mciSendCommandW(MCIDEVICEID wDevID, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
-{
-    DWORD ret;
-    int mapped;
-
-    TRACE("(%08x, %s, %08lx, %08lx)\n",
-	  wDevID, MCI_MessageToString(wMsg), dwParam1, dwParam2);
-
-    mapped = MCI_MapMsgWtoA(wMsg, dwParam1, &dwParam2);
-    if (mapped == -1)
-    {
-        FIXME("message %04x mapping failed\n", wMsg);
-        return MMSYSERR_NOMEM;
-    }
-    ret = mciSendCommandA(wDevID, wMsg, dwParam1, dwParam2);
-    if (mapped)
-        MCI_UnmapMsgWtoA(wMsg, dwParam1, dwParam2, ret);
-    return ret;
-}
-
-/**************************************************************************
- * 				mciGetDeviceIDA    		[WINMM.@]
- */
-UINT WINAPI mciGetDeviceIDA(LPCSTR lpstrName)
-{
-    return MCI_GetDriverFromString(lpstrName);
-}
-
-/**************************************************************************
- * 				mciGetDeviceIDW		       	[WINMM.@]
- */
-UINT WINAPI mciGetDeviceIDW(LPCWSTR lpwstrName)
-{
-    LPSTR 	lpstrName = NULL;
-    UINT	ret;
-    INT         len;
-
-    if (lpwstrName) {
-        len = WideCharToMultiByte( CP_ACP, 0, lpwstrName, -1, NULL, 0, NULL, NULL );
-        lpstrName = HeapAlloc( GetProcessHeap(), 0, len );
-        if (lpstrName) WideCharToMultiByte( CP_ACP, 0, lpwstrName, -1, lpstrName, len, NULL, NULL );
-    }
-    ret = MCI_GetDriverFromString(lpstrName);
-    HeapFree(GetProcessHeap(), 0, lpstrName);
-    return ret;
-}
-
-/**************************************************************************
- * 				MCI_DefYieldProc	       	[internal]
- */
-UINT WINAPI MCI_DefYieldProc(MCIDEVICEID wDevID, DWORD data)
-{
-    INT16	ret;
-
-    TRACE("(0x%04x, 0x%08lx)\n", wDevID, data);
-
-    if ((HIWORD(data) != 0 && HWND_16(GetActiveWindow()) != HIWORD(data)) ||
-	(GetAsyncKeyState(LOWORD(data)) & 1) == 0) {
-	MyUserYield();
-	ret = 0;
-    } else {
-	MSG		msg;
-
-	msg.hwnd = HWND_32(HIWORD(data));
-	while (!PeekMessageA(&msg, msg.hwnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE));
-	ret = -1;
-    }
-    return ret;
-}
-
-/**************************************************************************
- * 				mciSetYieldProc			[WINMM.@]
- */
-BOOL WINAPI mciSetYieldProc(MCIDEVICEID uDeviceID, YIELDPROC fpYieldProc, DWORD dwYieldData)
-{
-    LPWINE_MCIDRIVER	wmd;
-
-    TRACE("(%u, %p, %08lx)\n", uDeviceID, fpYieldProc, dwYieldData);
-
-    if (!(wmd = MCI_GetDriver(uDeviceID))) {
-	WARN("Bad uDeviceID\n");
-	return FALSE;
-    }
-
-    wmd->lpfnYieldProc = fpYieldProc;
-    wmd->dwYieldData   = dwYieldData;
-    wmd->bIs32         = TRUE;
-
-    return TRUE;
-}
-
-/**************************************************************************
- * 				mciGetDeviceIDFromElementIDW	[WINMM.@]
- */
-UINT WINAPI mciGetDeviceIDFromElementIDW(DWORD dwElementID, LPCWSTR lpstrType)
-{
-    /* FIXME: that's rather strange, there is no
-     * mciGetDeviceIDFromElementID32A in winmm.spec
-     */
-    FIXME("(%lu, %p) stub\n", dwElementID, lpstrType);
-    return 0;
-}
-
-/**************************************************************************
- * 				mciGetYieldProc			[WINMM.@]
- */
-YIELDPROC WINAPI mciGetYieldProc(MCIDEVICEID uDeviceID, DWORD* lpdwYieldData)
-{
-    LPWINE_MCIDRIVER	wmd;
-
-    TRACE("(%u, %p)\n", uDeviceID, lpdwYieldData);
-
-    if (!(wmd = MCI_GetDriver(uDeviceID))) {
-	WARN("Bad uDeviceID\n");
-	return NULL;
-    }
-    if (!wmd->lpfnYieldProc) {
-	WARN("No proc set\n");
-	return NULL;
-    }
-    if (!wmd->bIs32) {
-	WARN("Proc is 32 bit\n");
-	return NULL;
-    }
-    return wmd->lpfnYieldProc;
-}
-
-/**************************************************************************
- * 				mciGetCreatorTask		[WINMM.@]
- */
-HTASK WINAPI mciGetCreatorTask(MCIDEVICEID uDeviceID)
-{
-    LPWINE_MCIDRIVER	wmd;
-    HTASK ret = 0;
-
-    if ((wmd = MCI_GetDriver(uDeviceID))) ret = (HTASK)wmd->CreatorThread;
-
-    TRACE("(%u) => %p\n", uDeviceID, ret);
-    return ret;
-}
-
-/**************************************************************************
- * 			mciDriverYield				[WINMM.@]
- */
-UINT WINAPI mciDriverYield(MCIDEVICEID uDeviceID)
-{
-    LPWINE_MCIDRIVER	wmd;
-    UINT		ret = 0;
-
-    TRACE("(%04x)\n", uDeviceID);
-
-    if (!(wmd = MCI_GetDriver(uDeviceID)) || !wmd->lpfnYieldProc || !wmd->bIs32) {
-	MyUserYield();
-    } else {
-	ret = wmd->lpfnYieldProc(uDeviceID, wmd->dwYieldData);
-    }
-
-    return ret;
-}
-
-/**************************************************************************
  * 				midiOutGetNumDevs	[WINMM.@]
  */
 UINT WINAPI midiOutGetNumDevs(void)
@@ -1295,49 +816,50 @@
 }
 
 /**************************************************************************
- * 				MIDI_GetErrorText       	[internal]
+ * 				midiOutGetErrorTextA 	[WINMM.@]
+ * 				midiInGetErrorTextA 	[WINMM.@]
  */
-static	UINT16	MIDI_GetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
+UINT WINAPI midiOutGetErrorTextA(UINT uError, LPSTR lpText, UINT uSize)
 {
-    UINT16		ret = MMSYSERR_BADERRNUM;
+    UINT	ret;
 
-    if (lpText == NULL) {
-	ret = MMSYSERR_INVALPARAM;
-    } else if (uSize == 0) {
-	ret = MMSYSERR_NOERROR;
-    } else if (
-	       /* test has been removed 'coz MMSYSERR_BASE is 0, and gcc did emit
-		* a warning for the test was always true */
-	       (/*uError >= MMSYSERR_BASE && */ uError <= MMSYSERR_LASTERROR) ||
-	       (uError >= MIDIERR_BASE  && uError <= MIDIERR_LASTERROR)) {
-
-	if (LoadStringA(WINMM_IData->hWinMM32Instance,
-			uError, lpText, uSize) > 0) {
-	    ret = MMSYSERR_NOERROR;
-	}
+    if (lpText == NULL) ret = MMSYSERR_INVALPARAM;
+    else if (uSize == 0) ret = MMSYSERR_NOERROR;
+    else
+    {
+        LPWSTR	xstr = HeapAlloc(GetProcessHeap(), 0, uSize * sizeof(WCHAR));
+        if (!xstr) ret = MMSYSERR_NOMEM;
+        else
+        {
+            ret = midiOutGetErrorTextW(uError, xstr, uSize);
+            if (ret == MMSYSERR_NOERROR)
+                WideCharToMultiByte(CP_ACP, 0, xstr, -1, lpText, uSize, NULL, NULL);
+            HeapFree(GetProcessHeap(), 0, xstr);
+        }
     }
     return ret;
 }
 
 /**************************************************************************
- * 				midiOutGetErrorTextA 	[WINMM.@]
- */
-UINT WINAPI midiOutGetErrorTextA(UINT uError, LPSTR lpText, UINT uSize)
-{
-    return MIDI_GetErrorText(uError, lpText, uSize);
-}
-
-/**************************************************************************
  * 				midiOutGetErrorTextW 	[WINMM.@]
+ * 				midiInGetErrorTextW 	[WINMM.@]
  */
 UINT WINAPI midiOutGetErrorTextW(UINT uError, LPWSTR lpText, UINT uSize)
 {
-    LPSTR	xstr = HeapAlloc(GetProcessHeap(), 0, uSize);
-    UINT	ret;
+    UINT        ret = MMSYSERR_BADERRNUM;
 
-    ret = MIDI_GetErrorText(uError, xstr, uSize);
-    MultiByteToWideChar( CP_ACP, 0, xstr, -1, lpText, uSize );
-    HeapFree(GetProcessHeap(), 0, xstr);
+    if (lpText == NULL) ret = MMSYSERR_INVALPARAM;
+    else if (uSize == 0) ret = MMSYSERR_NOERROR;
+    else if (
+	       /* test has been removed 'coz MMSYSERR_BASE is 0, and gcc did emit
+		* a warning for the test was always true */
+	       (/*uError >= MMSYSERR_BASE && */ uError <= MMSYSERR_LASTERROR) ||
+	       (uError >= MIDIERR_BASE  && uError <= MIDIERR_LASTERROR)) {
+	if (LoadStringW(WINMM_IData->hWinMM32Instance,
+			uError, lpText, uSize) > 0) {
+	    ret = MMSYSERR_NOERROR;
+	}
+    }
     return ret;
 }
 
@@ -1670,27 +1192,6 @@
     return ret;
 }
 
-/**************************************************************************
- * 				midiInGetErrorTextW 		[WINMM.@]
- */
-UINT WINAPI midiInGetErrorTextW(UINT uError, LPWSTR lpText, UINT uSize)
-{
-    LPSTR	xstr = HeapAlloc(GetProcessHeap(), 0, uSize);
-    UINT	ret = MIDI_GetErrorText(uError, xstr, uSize);
-
-    MultiByteToWideChar( CP_ACP, 0, xstr, -1, lpText, uSize );
-    HeapFree(GetProcessHeap(), 0, xstr);
-    return ret;
-}
-
-/**************************************************************************
- * 				midiInGetErrorTextA 		[WINMM.@]
- */
-UINT WINAPI midiInGetErrorTextA(UINT uError, LPSTR lpText, UINT uSize)
-{
-    return MIDI_GetErrorText(uError, lpText, uSize);
-}
-
 UINT MIDI_InOpen(HMIDIIN* lphMidiIn, UINT uDeviceID, DWORD_PTR dwCallback,
                  DWORD_PTR dwInstance, DWORD dwFlags, BOOL bFrom32)
 {
@@ -2625,48 +2126,50 @@
 }
 
 /**************************************************************************
- * 				WAVE_GetErrorText       	[internal]
+ * 				waveOutGetErrorTextA 	[WINMM.@]
+ * 				waveInGetErrorTextA 	[WINMM.@]
  */
-static	UINT16	WAVE_GetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
+UINT WINAPI waveOutGetErrorTextA(UINT uError, LPSTR lpText, UINT uSize)
 {
-    UINT16		ret = MMSYSERR_BADERRNUM;
+    UINT	ret;
 
-    if (lpText == NULL) {
-	ret = MMSYSERR_INVALPARAM;
-    } else if (uSize == 0) {
-	ret = MMSYSERR_NOERROR;
-    } else if (
-	       /* test has been removed 'coz MMSYSERR_BASE is 0, and gcc did emit
-		* a warning for the test was always true */
-	       (/*uError >= MMSYSERR_BASE && */uError <= MMSYSERR_LASTERROR) ||
-	       (uError >= WAVERR_BASE  && uError <= WAVERR_LASTERROR)) {
-
-	if (LoadStringA(WINMM_IData->hWinMM32Instance,
-			uError, lpText, uSize) > 0) {
-	    ret = MMSYSERR_NOERROR;
-	}
+    if (lpText == NULL) ret = MMSYSERR_INVALPARAM;
+    else if (uSize == 0) ret = MMSYSERR_NOERROR;
+    else
+    {
+        LPWSTR	xstr = HeapAlloc(GetProcessHeap(), 0, uSize * sizeof(WCHAR));
+        if (!xstr) ret = MMSYSERR_NOMEM;
+        else
+        {
+            ret = waveOutGetErrorTextW(uError, xstr, uSize);
+            if (ret == MMSYSERR_NOERROR)
+                WideCharToMultiByte(CP_ACP, 0, xstr, -1, lpText, uSize, NULL, NULL);
+            HeapFree(GetProcessHeap(), 0, xstr);
+        }
     }
     return ret;
 }
 
 /**************************************************************************
- * 				waveOutGetErrorTextA 	[WINMM.@]
- */
-UINT WINAPI waveOutGetErrorTextA(UINT uError, LPSTR lpText, UINT uSize)
-{
-    return WAVE_GetErrorText(uError, lpText, uSize);
-}
-
-/**************************************************************************
  * 				waveOutGetErrorTextW 	[WINMM.@]
+ * 				waveInGetErrorTextW 	[WINMM.@]
  */
 UINT WINAPI waveOutGetErrorTextW(UINT uError, LPWSTR lpText, UINT uSize)
 {
-    LPSTR	xstr = HeapAlloc(GetProcessHeap(), 0, uSize);
-    UINT	ret = WAVE_GetErrorText(uError, xstr, uSize);
+    UINT        ret = MMSYSERR_BADERRNUM;
 
-    MultiByteToWideChar( CP_ACP, 0, xstr, -1, lpText, uSize );
-    HeapFree(GetProcessHeap(), 0, xstr);
+    if (lpText == NULL) ret = MMSYSERR_INVALPARAM;
+    else if (uSize == 0) ret = MMSYSERR_NOERROR;
+    else if (
+	       /* test has been removed 'coz MMSYSERR_BASE is 0, and gcc did emit
+		* a warning for the test was always true */
+	       (/*uError >= MMSYSERR_BASE && */ uError <= MMSYSERR_LASTERROR) ||
+	       (uError >= WAVERR_BASE  && uError <= WAVERR_LASTERROR)) {
+	if (LoadStringW(WINMM_IData->hWinMM32Instance,
+			uError, lpText, uSize) > 0) {
+	    ret = MMSYSERR_NOERROR;
+	}
+    }
     return ret;
 }
 
@@ -3037,27 +2540,6 @@
 }
 
 /**************************************************************************
- * 				waveInGetErrorTextA 	[WINMM.@]
- */
-UINT WINAPI waveInGetErrorTextA(UINT uError, LPSTR lpText, UINT uSize)
-{
-    return WAVE_GetErrorText(uError, lpText, uSize);
-}
-
-/**************************************************************************
- * 				waveInGetErrorTextW 	[WINMM.@]
- */
-UINT WINAPI waveInGetErrorTextW(UINT uError, LPWSTR lpText, UINT uSize)
-{
-    LPSTR txt = HeapAlloc(GetProcessHeap(), 0, uSize);
-    UINT	ret = WAVE_GetErrorText(uError, txt, uSize);
-
-    MultiByteToWideChar( CP_ACP, 0, txt, -1, lpText, uSize );
-    HeapFree(GetProcessHeap(), 0, txt);
-    return ret;
-}
-
-/**************************************************************************
  * 				waveInOpen			[WINMM.@]
  */
 MMRESULT WINAPI waveInOpen(HWAVEIN* lphWaveIn, UINT uDeviceID,
diff --git a/dlls/winmm/winmm.spec b/dlls/winmm/winmm.spec
index 003d467..215296e 100644
--- a/dlls/winmm/winmm.spec
+++ b/dlls/winmm/winmm.spec
@@ -10,12 +10,12 @@
 @ stdcall DrvClose(long long long) CloseDriver
 @ stdcall DrvDefDriverProc(long long long long long) DefDriverProc
 @ stdcall DrvGetModuleHandle(long) GetDriverModuleHandle
-@ stdcall DrvOpen(wstr wstr long) OpenDriverW
+@ stdcall DrvOpen(wstr wstr long) OpenDriver
 @ stdcall DrvOpenA(str str long) OpenDriverA
 @ stdcall DrvSendMessage(long long long long) SendDriverMessage
 @ stdcall GetDriverFlags(long)
 @ stdcall GetDriverModuleHandle(long)
-@ stdcall OpenDriver(wstr wstr long) OpenDriverW
+@ stdcall OpenDriver(wstr wstr long)
 @ stdcall OpenDriverA(str str long)
 @ stdcall PlaySound(ptr long long) PlaySoundA
 @ stdcall PlaySoundW(ptr long long)
@@ -42,8 +42,9 @@
 @ stdcall mciFreeCommandResource(long)
 @ stdcall mciGetCreatorTask(long)
 @ stdcall mciGetDeviceIDA(str)
-@ stdcall mciGetDeviceIDFromElementIDW(long str)
-@ stdcall mciGetDeviceIDW(str)
+@ stdcall mciGetDeviceIDW(wstr)
+@ stdcall mciGetDeviceIDFromElementIDA(long str)
+@ stdcall mciGetDeviceIDFromElementIDW(long wstr)
 @ stdcall mciGetDriverData(long)
 @ stdcall mciGetErrorStringA(long ptr long)
 @ stdcall mciGetErrorStringW(long ptr long)
@@ -61,8 +62,8 @@
 @ stdcall midiInClose(long)
 @ stdcall midiInGetDevCapsA(long ptr long)
 @ stdcall midiInGetDevCapsW(long ptr long)
-@ stdcall midiInGetErrorTextA(long ptr long)
-@ stdcall midiInGetErrorTextW(long ptr long)
+@ stdcall midiInGetErrorTextA(long ptr long) midiOutGetErrorTextA
+@ stdcall midiInGetErrorTextW(long ptr long) midiOutGetErrorTextW
 @ stdcall midiInGetID(long ptr)
 @ stdcall midiInGetNumDevs()
 @ stdcall midiInMessage(long long long long)
@@ -153,8 +154,8 @@
 @ stdcall waveInClose(long)
 @ stdcall waveInGetDevCapsA(long ptr long)
 @ stdcall waveInGetDevCapsW(long ptr long)
-@ stdcall waveInGetErrorTextA(long ptr long)
-@ stdcall waveInGetErrorTextW(long ptr long)
+@ stdcall waveInGetErrorTextA(long ptr long) waveOutGetErrorTextA
+@ stdcall waveInGetErrorTextW(long ptr long) waveOutGetErrorTextW
 @ stdcall waveInGetID(long ptr)
 @ stdcall waveInGetNumDevs()
 @ stdcall waveInGetPosition(long ptr long)
@@ -188,3 +189,23 @@
 @ stdcall waveOutSetVolume(long long)
 @ stdcall waveOutUnprepareHeader(long ptr long)
 @ stdcall waveOutWrite(long ptr long)
+# MigrateAllDrivers
+# MigrateSoundEvents
+# NotifyCallbackData
+# WOW32DriverCallback
+# WOW32ResolveMultiMediaHandle
+# WOWAppExit
+# WinmmLogoff
+# WinmmLogon
+# mid32Message
+# mmDrvInstall
+# aux32Message
+# joy32Message
+# mci32Message
+# mod32Message
+# mxd32Message
+# tid32Message
+# wid32Message
+# winmmDbgOut
+# winmmSetDebugLevel
+# wod32Message
diff --git a/dlls/winmm/winmm_res.rc b/dlls/winmm/winmm_res.rc
index eec7881..eeee8a0 100644
--- a/dlls/winmm/winmm_res.rc
+++ b/dlls/winmm/winmm_res.rc
@@ -47,773 +47,773 @@
 
 CORE RCDATA
 BEGIN
-"open\0", 0x00000803L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"type\0", 0x00002000L, MCI_STRING,
-"element\0", 0x00000200L, MCI_STRING,
-"alias\0", 0x00000400L, MCI_STRING,
-"shareable\0", 0x00000100L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"close\0", 0x00000804L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"play\0", 0x00000806L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"record\0", 0x0000080fL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"insert\0", 0x00000100L, MCI_FLAG,
-"overwrite\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"seek\0", 0x00000807L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"to start\0", 0x00000100L, MCI_FLAG,
-"to end\0", 0x00000200L, MCI_FLAG,
-"to\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"stop\0", 0x00000808L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"pause\0", 0x00000809L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"status\0", 0x00000814L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"position\0", 0x00000002L, MCI_INTEGER,
-"length\0", 0x00000001L, MCI_INTEGER,
-"number of tracks\0", 0x00000003L, MCI_INTEGER,
-"ready\0", 0x00000007L, MCI_INTEGER,
-"mode\0", 0x00000004L, MCI_INTEGER,
-"time format\0", 0x00000006L, MCI_INTEGER,
-"current track\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"track\0", 0x00000010L, MCI_INTEGER,
-"start\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"can record\0", 0x00000001L, MCI_INTEGER,
-"has audio\0", 0x00000002L, MCI_INTEGER,
-"has video\0", 0x00000003L, MCI_INTEGER,
-"uses files\0", 0x00000005L, MCI_INTEGER,
-"compound device\0", 0x00000006L, MCI_INTEGER,
-"device type\0", 0x00000004L, MCI_INTEGER,
-"can eject\0", 0x00000007L, MCI_INTEGER,
-"can play\0", 0x00000008L, MCI_INTEGER,
-"can save\0", 0x00000009L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"product\0", 0x00000100L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"time format\0", 0x00000400L, MCI_CONSTANT,
-"milliseconds\0", 0x00000000L, MCI_INTEGER,
-"ms\0", 0x00000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"door open\0", 0x00000100L, MCI_FLAG,
-"door closed\0", 0x00000200L, MCI_FLAG,
-"audio\0", 0x00000800L, MCI_CONSTANT,
-"all\0", 0x00000000L, MCI_INTEGER,
-"left\0", 0x00000001L, MCI_INTEGER,
-"right\0", 0x00000002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"video\0", 0x00001000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"sysinfo\0", 0x00000810L, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"quantity\0", 0x00000100L, MCI_FLAG,
-"open\0", 0x00000200L, MCI_FLAG,
-"installname\0", 0x00000800L, MCI_FLAG,
-"name\0", 0x00000400L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"break\0", 0x00000811L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"on\0", 0x00000100L, MCI_INTEGER,
-"off\0", 0x00000400L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"sound\0", 0x00000812L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"save\0", 0x00000813L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_STRING,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"load\0", 0x00000850L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_STRING,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"resume\0", 0x00000855L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"\0", 0x00000000L, MCI_END_COMMAND_LIST
+L"open\0", 0x00000803L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"type\0", 0x00002000L, MCI_STRING,
+L"element\0", 0x00000200L, MCI_STRING,
+L"alias\0", 0x00000400L, MCI_STRING,
+L"shareable\0", 0x00000100L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"close\0", 0x00000804L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"play\0", 0x00000806L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"record\0", 0x0000080fL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"insert\0", 0x00000100L, MCI_FLAG,
+L"overwrite\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"seek\0", 0x00000807L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"to start\0", 0x00000100L, MCI_FLAG,
+L"to end\0", 0x00000200L, MCI_FLAG,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"stop\0", 0x00000808L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"pause\0", 0x00000809L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"status\0", 0x00000814L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"position\0", 0x00000002L, MCI_INTEGER,
+L"length\0", 0x00000001L, MCI_INTEGER,
+L"number of tracks\0", 0x00000003L, MCI_INTEGER,
+L"ready\0", 0x00000007L, MCI_INTEGER,
+L"mode\0", 0x00000004L, MCI_INTEGER,
+L"time format\0", 0x00000006L, MCI_INTEGER,
+L"current track\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"track\0", 0x00000010L, MCI_INTEGER,
+L"start\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"can record\0", 0x00000001L, MCI_INTEGER,
+L"has audio\0", 0x00000002L, MCI_INTEGER,
+L"has video\0", 0x00000003L, MCI_INTEGER,
+L"uses files\0", 0x00000005L, MCI_INTEGER,
+L"compound device\0", 0x00000006L, MCI_INTEGER,
+L"device type\0", 0x00000004L, MCI_INTEGER,
+L"can eject\0", 0x00000007L, MCI_INTEGER,
+L"can play\0", 0x00000008L, MCI_INTEGER,
+L"can save\0", 0x00000009L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"product\0", 0x00000100L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"time format\0", 0x00000400L, MCI_CONSTANT,
+L"milliseconds\0", 0x00000000L, MCI_INTEGER,
+L"ms\0", 0x00000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"door open\0", 0x00000100L, MCI_FLAG,
+L"door closed\0", 0x00000200L, MCI_FLAG,
+L"audio\0", 0x00000800L, MCI_CONSTANT,
+L"all\0", 0x00000000L, MCI_INTEGER,
+L"left\0", 0x00000001L, MCI_INTEGER,
+L"right\0", 0x00000002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"video\0", 0x00001000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"sysinfo\0", 0x00000810L, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"quantity\0", 0x00000100L, MCI_FLAG,
+L"open\0", 0x00000200L, MCI_FLAG,
+L"installname\0", 0x00000800L, MCI_FLAG,
+L"name\0", 0x00000400L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"break\0", 0x00000811L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"on\0", 0x00000100L, MCI_INTEGER,
+L"off\0", 0x00000400L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"sound\0", 0x00000812L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"save\0", 0x00000813L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_STRING,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"load\0", 0x00000850L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_STRING,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"resume\0", 0x00000855L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"\0", 0x00000000L, MCI_END_COMMAND_LIST
 END
 
 VIDEODISC RCDATA
 BEGIN
-"play\0", 0x00000806L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"fast\0", 0x00020000L, MCI_FLAG,
-"slow\0", 0x00100000L, MCI_FLAG,
-"speed\0", 0x00040000L, MCI_INTEGER,
-"reverse\0", 0x00010000L, MCI_FLAG,
-"scan\0", 0x00080000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"seek\0", 0x00000807L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"reverse\0", 0x00010000L, MCI_FLAG,
-"to start\0", 0x00000100L, MCI_FLAG,
-"to end\0", 0x00000200L, MCI_FLAG,
-"to\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"spin\0", 0x0000080cL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"up\0", 0x00010000L, MCI_FLAG,
-"down\0", 0x00020000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"step\0", 0x0000080eL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"reverse\0", 0x00020000L, MCI_FLAG,
-"by\0", 0x00010000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"time format\0", 0x00000400L, MCI_CONSTANT,
-"milliseconds\0", 0x00000000L, MCI_INTEGER,
-"ms\0", 0x00000000L, MCI_INTEGER,
-"frames\0", 0x00000003L, MCI_INTEGER,
-"hms\0", 0x00000001L, MCI_INTEGER,
-"track\0", 0x00004001L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"door open\0", 0x00000100L, MCI_FLAG,
-"door closed\0", 0x00000200L, MCI_FLAG,
-"audio\0", 0x00000800L, MCI_CONSTANT,
-"all\0", 0x00000000L, MCI_INTEGER,
-"left\0", 0x00000001L, MCI_INTEGER,
-"right\0", 0x00000002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"video\0", 0x00001000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"status\0", 0x00000814L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"position\0", 0x00000002L, MCI_INTEGER,
-"length\0", 0x00000001L, MCI_INTEGER,
-"number of tracks\0", 0x00000003L, MCI_INTEGER,
-"mode\0", 0x00000004L, MCI_INTEGER,
-"media present\0", 0x00000005L, MCI_INTEGER,
-"speed\0", 0x00004002L, MCI_INTEGER,
-"forward\0", 0x00004003L, MCI_INTEGER,
-"media type\0", 0x00004004L, MCI_INTEGER,
-"ready\0", 0x00000007L, MCI_INTEGER,
-"side\0", 0x00004005L, MCI_INTEGER,
-"disc size\0", 0x00004006L, MCI_INTEGER,
-"time format\0", 0x00000006L, MCI_INTEGER,
-"current track\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"track\0", 0x00000010L, MCI_INTEGER,
-"start\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"clv\0", 0x00010000L, MCI_FLAG,
-"cav\0", 0x00020000L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"can record\0", 0x00000001L, MCI_INTEGER,
-"has audio\0", 0x00000002L, MCI_INTEGER,
-"has video\0", 0x00000003L, MCI_INTEGER,
-"device type\0", 0x00000004L, MCI_INTEGER,
-"uses files\0", 0x00000005L, MCI_INTEGER,
-"compound device\0", 0x00000006L, MCI_INTEGER,
-"can eject\0", 0x00000007L, MCI_INTEGER,
-"can reverse\0", 0x00004002L, MCI_INTEGER,
-"can play\0", 0x00000008L, MCI_INTEGER,
-"can save\0", 0x00000009L, MCI_INTEGER,
-"fast play rate\0", 0x00004003L, MCI_INTEGER,
-"slow play rate\0", 0x00004004L, MCI_INTEGER,
-"normal play rate\0", 0x00004005L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"escape\0", 0x00000805L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_STRING,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"product\0", 0x00000100L, MCI_FLAG,
-"identity\0", 0x00000800L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"\0", 0x00000000L, MCI_END_COMMAND_LIST
+L"play\0", 0x00000806L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"fast\0", 0x00020000L, MCI_FLAG,
+L"slow\0", 0x00100000L, MCI_FLAG,
+L"speed\0", 0x00040000L, MCI_INTEGER,
+L"reverse\0", 0x00010000L, MCI_FLAG,
+L"scan\0", 0x00080000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"seek\0", 0x00000807L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"reverse\0", 0x00010000L, MCI_FLAG,
+L"to start\0", 0x00000100L, MCI_FLAG,
+L"to end\0", 0x00000200L, MCI_FLAG,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"spin\0", 0x0000080cL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"up\0", 0x00010000L, MCI_FLAG,
+L"down\0", 0x00020000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"step\0", 0x0000080eL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"reverse\0", 0x00020000L, MCI_FLAG,
+L"by\0", 0x00010000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"time format\0", 0x00000400L, MCI_CONSTANT,
+L"milliseconds\0", 0x00000000L, MCI_INTEGER,
+L"ms\0", 0x00000000L, MCI_INTEGER,
+L"frames\0", 0x00000003L, MCI_INTEGER,
+L"hms\0", 0x00000001L, MCI_INTEGER,
+L"track\0", 0x00004001L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"door open\0", 0x00000100L, MCI_FLAG,
+L"door closed\0", 0x00000200L, MCI_FLAG,
+L"audio\0", 0x00000800L, MCI_CONSTANT,
+L"all\0", 0x00000000L, MCI_INTEGER,
+L"left\0", 0x00000001L, MCI_INTEGER,
+L"right\0", 0x00000002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"video\0", 0x00001000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"status\0", 0x00000814L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"position\0", 0x00000002L, MCI_INTEGER,
+L"length\0", 0x00000001L, MCI_INTEGER,
+L"number of tracks\0", 0x00000003L, MCI_INTEGER,
+L"mode\0", 0x00000004L, MCI_INTEGER,
+L"media present\0", 0x00000005L, MCI_INTEGER,
+L"speed\0", 0x00004002L, MCI_INTEGER,
+L"forward\0", 0x00004003L, MCI_INTEGER,
+L"media type\0", 0x00004004L, MCI_INTEGER,
+L"ready\0", 0x00000007L, MCI_INTEGER,
+L"side\0", 0x00004005L, MCI_INTEGER,
+L"disc size\0", 0x00004006L, MCI_INTEGER,
+L"time format\0", 0x00000006L, MCI_INTEGER,
+L"current track\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"track\0", 0x00000010L, MCI_INTEGER,
+L"start\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"clv\0", 0x00010000L, MCI_FLAG,
+L"cav\0", 0x00020000L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"can record\0", 0x00000001L, MCI_INTEGER,
+L"has audio\0", 0x00000002L, MCI_INTEGER,
+L"has video\0", 0x00000003L, MCI_INTEGER,
+L"device type\0", 0x00000004L, MCI_INTEGER,
+L"uses files\0", 0x00000005L, MCI_INTEGER,
+L"compound device\0", 0x00000006L, MCI_INTEGER,
+L"can eject\0", 0x00000007L, MCI_INTEGER,
+L"can reverse\0", 0x00004002L, MCI_INTEGER,
+L"can play\0", 0x00000008L, MCI_INTEGER,
+L"can save\0", 0x00000009L, MCI_INTEGER,
+L"fast play rate\0", 0x00004003L, MCI_INTEGER,
+L"slow play rate\0", 0x00004004L, MCI_INTEGER,
+L"normal play rate\0", 0x00004005L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"escape\0", 0x00000805L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_STRING,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"product\0", 0x00000100L, MCI_FLAG,
+L"identity\0", 0x00000800L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"\0", 0x00000000L, MCI_END_COMMAND_LIST
 END
 
 WAVEAUDIO RCDATA
 BEGIN
-"open\0", 0x00000803L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"type\0", 0x00002000L, MCI_STRING,
-"element\0", 0x00000200L, MCI_STRING,
-"alias\0", 0x00000400L, MCI_STRING,
-"shareable\0", 0x00000100L, MCI_FLAG,
-"buffer\0", 0x00010000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"status\0", 0x00000814L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"position\0", 0x00000002L, MCI_INTEGER,
-"length\0", 0x00000001L, MCI_INTEGER,
-"number of tracks\0", 0x00000003L, MCI_INTEGER,
-"media present\0", 0x00000005L, MCI_INTEGER,
-"mode\0", 0x00000004L, MCI_INTEGER,
-"format tag\0", 0x00004001L, MCI_INTEGER,
-"channels\0", 0x00004002L, MCI_INTEGER,
-"samplespersec\0", 0x00004003L, MCI_INTEGER,
-"bytespersec\0", 0x00004004L, MCI_INTEGER,
-"alignment\0", 0x00004005L, MCI_INTEGER,
-"bitspersample\0", 0x00004006L, MCI_INTEGER,
-"input\0", 0x00400000L, MCI_INTEGER,
-"output\0", 0x00800000L, MCI_INTEGER,
-"level\0", 0x00004007L, MCI_INTEGER,
-"ready\0", 0x00000007L, MCI_INTEGER,
-"time format\0", 0x00000006L, MCI_INTEGER,
-"current track\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"track\0", 0x00000010L, MCI_INTEGER,
-"start\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"any input\0", 0x04000000L, MCI_FLAG,
-"any output\0", 0x08000000L, MCI_FLAG,
-"time format\0", 0x00000400L, MCI_CONSTANT,
-"milliseconds\0", 0x00000000L, MCI_INTEGER,
-"ms\0", 0x00000000L, MCI_INTEGER,
-"bytes\0", 0x00000008L, MCI_INTEGER,
-"samples\0", 0x00000009L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"audio\0", 0x00000800L, MCI_CONSTANT,
-"all\0", 0x00000000L, MCI_INTEGER,
-"left\0", 0x00000001L, MCI_INTEGER,
-"right\0", 0x00000002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"video\0", 0x00001000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"door open\0", 0x00000100L, MCI_FLAG,
-"door closed\0", 0x00000200L, MCI_FLAG,
-"input\0", 0x00400000L, MCI_INTEGER,
-"output\0", 0x00800000L, MCI_INTEGER,
-"format tag\0", 0x00010000L, MCI_CONSTANT,
-"pcm\0", 0x00000001L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"channels\0", 0x00020000L, MCI_INTEGER,
-"samplespersec\0", 0x00040000L, MCI_INTEGER,
-"bytespersec\0", 0x00080000L, MCI_INTEGER,
-"alignment\0", 0x00100000L, MCI_INTEGER,
-"bitspersample\0", 0x00200000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"can record\0", 0x00000001L, MCI_INTEGER,
-"has audio\0", 0x00000002L, MCI_INTEGER,
-"has video\0", 0x00000003L, MCI_INTEGER,
-"device type\0", 0x00000004L, MCI_INTEGER,
-"uses files\0", 0x00000005L, MCI_INTEGER,
-"compound device\0", 0x00000006L, MCI_INTEGER,
-"can eject\0", 0x00000007L, MCI_INTEGER,
-"can play\0", 0x00000008L, MCI_INTEGER,
-"can save\0", 0x00000009L, MCI_INTEGER,
-"inputs\0", 0x00004001L, MCI_INTEGER,
-"outputs\0", 0x00004002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"product\0", 0x00000100L, MCI_FLAG,
-"input\0", 0x00400000L, MCI_FLAG,
-"output\0", 0x00800000L, MCI_FLAG,
-"file\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"cue\0", 0x00000830L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"input\0", 0x00400000L, MCI_FLAG,
-"output\0", 0x00800000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"delete\0", 0x00000856L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"\0", 0x00000000L, MCI_END_COMMAND_LIST
+L"open\0", 0x00000803L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"type\0", 0x00002000L, MCI_STRING,
+L"element\0", 0x00000200L, MCI_STRING,
+L"alias\0", 0x00000400L, MCI_STRING,
+L"shareable\0", 0x00000100L, MCI_FLAG,
+L"buffer\0", 0x00010000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"status\0", 0x00000814L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"position\0", 0x00000002L, MCI_INTEGER,
+L"length\0", 0x00000001L, MCI_INTEGER,
+L"number of tracks\0", 0x00000003L, MCI_INTEGER,
+L"media present\0", 0x00000005L, MCI_INTEGER,
+L"mode\0", 0x00000004L, MCI_INTEGER,
+L"format tag\0", 0x00004001L, MCI_INTEGER,
+L"channels\0", 0x00004002L, MCI_INTEGER,
+L"samplespersec\0", 0x00004003L, MCI_INTEGER,
+L"bytespersec\0", 0x00004004L, MCI_INTEGER,
+L"alignment\0", 0x00004005L, MCI_INTEGER,
+L"bitspersample\0", 0x00004006L, MCI_INTEGER,
+L"input\0", 0x00400000L, MCI_INTEGER,
+L"output\0", 0x00800000L, MCI_INTEGER,
+L"level\0", 0x00004007L, MCI_INTEGER,
+L"ready\0", 0x00000007L, MCI_INTEGER,
+L"time format\0", 0x00000006L, MCI_INTEGER,
+L"current track\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"track\0", 0x00000010L, MCI_INTEGER,
+L"start\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"any input\0", 0x04000000L, MCI_FLAG,
+L"any output\0", 0x08000000L, MCI_FLAG,
+L"time format\0", 0x00000400L, MCI_CONSTANT,
+L"milliseconds\0", 0x00000000L, MCI_INTEGER,
+L"ms\0", 0x00000000L, MCI_INTEGER,
+L"bytes\0", 0x00000008L, MCI_INTEGER,
+L"samples\0", 0x00000009L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"audio\0", 0x00000800L, MCI_CONSTANT,
+L"all\0", 0x00000000L, MCI_INTEGER,
+L"left\0", 0x00000001L, MCI_INTEGER,
+L"right\0", 0x00000002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"video\0", 0x00001000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"door open\0", 0x00000100L, MCI_FLAG,
+L"door closed\0", 0x00000200L, MCI_FLAG,
+L"input\0", 0x00400000L, MCI_INTEGER,
+L"output\0", 0x00800000L, MCI_INTEGER,
+L"format tag\0", 0x00010000L, MCI_CONSTANT,
+L"pcm\0", 0x00000001L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"channels\0", 0x00020000L, MCI_INTEGER,
+L"samplespersec\0", 0x00040000L, MCI_INTEGER,
+L"bytespersec\0", 0x00080000L, MCI_INTEGER,
+L"alignment\0", 0x00100000L, MCI_INTEGER,
+L"bitspersample\0", 0x00200000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"can record\0", 0x00000001L, MCI_INTEGER,
+L"has audio\0", 0x00000002L, MCI_INTEGER,
+L"has video\0", 0x00000003L, MCI_INTEGER,
+L"device type\0", 0x00000004L, MCI_INTEGER,
+L"uses files\0", 0x00000005L, MCI_INTEGER,
+L"compound device\0", 0x00000006L, MCI_INTEGER,
+L"can eject\0", 0x00000007L, MCI_INTEGER,
+L"can play\0", 0x00000008L, MCI_INTEGER,
+L"can save\0", 0x00000009L, MCI_INTEGER,
+L"inputs\0", 0x00004001L, MCI_INTEGER,
+L"outputs\0", 0x00004002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"product\0", 0x00000100L, MCI_FLAG,
+L"input\0", 0x00400000L, MCI_FLAG,
+L"output\0", 0x00800000L, MCI_FLAG,
+L"file\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"cue\0", 0x00000830L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"input\0", 0x00400000L, MCI_FLAG,
+L"output\0", 0x00800000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"delete\0", 0x00000856L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"\0", 0x00000000L, MCI_END_COMMAND_LIST
 END
 
 CDAUDIO RCDATA
 BEGIN
-"status\0", 0x00000814L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"position\0", 0x00000002L, MCI_INTEGER,
-"length\0", 0x00000001L, MCI_INTEGER,
-"number of tracks\0", 0x00000003L, MCI_INTEGER,
-"ready\0", 0x00000007L, MCI_INTEGER,
-"mode\0", 0x00000004L, MCI_INTEGER,
-"media present\0", 0x00000005L, MCI_INTEGER,
-"time format\0", 0x00000006L, MCI_INTEGER,
-"current track\0", 0x00000008L, MCI_INTEGER,
-"type\0", 0x00004001L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"track\0", 0x00000010L, MCI_INTEGER,
-"start\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"time format\0", 0x00000400L, MCI_CONSTANT,
-"msf\0", 0x00000002L, MCI_INTEGER,
-"tmsf\0", 0x0000000aL, MCI_INTEGER,
-"milliseconds\0", 0x00000000L, MCI_INTEGER,
-"ms\0", 0x00000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"audio\0", 0x00000800L, MCI_CONSTANT,
-"all\0", 0x00000000L, MCI_INTEGER,
-"left\0", 0x00000001L, MCI_INTEGER,
-"right\0", 0x00000002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"video\0", 0x00001000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"door open\0", 0x00000100L, MCI_FLAG,
-"door closed\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"product\0", 0x00000100L, MCI_FLAG,
-"upc\0", 0x00000400L, MCI_FLAG,
-"identity\0", 0x00000800L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"\0", 0x00000000L, MCI_END_COMMAND_LIST
+L"status\0", 0x00000814L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"position\0", 0x00000002L, MCI_INTEGER,
+L"length\0", 0x00000001L, MCI_INTEGER,
+L"number of tracks\0", 0x00000003L, MCI_INTEGER,
+L"ready\0", 0x00000007L, MCI_INTEGER,
+L"mode\0", 0x00000004L, MCI_INTEGER,
+L"media present\0", 0x00000005L, MCI_INTEGER,
+L"time format\0", 0x00000006L, MCI_INTEGER,
+L"current track\0", 0x00000008L, MCI_INTEGER,
+L"type\0", 0x00004001L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"track\0", 0x00000010L, MCI_INTEGER,
+L"start\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"time format\0", 0x00000400L, MCI_CONSTANT,
+L"msf\0", 0x00000002L, MCI_INTEGER,
+L"tmsf\0", 0x0000000aL, MCI_INTEGER,
+L"milliseconds\0", 0x00000000L, MCI_INTEGER,
+L"ms\0", 0x00000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"audio\0", 0x00000800L, MCI_CONSTANT,
+L"all\0", 0x00000000L, MCI_INTEGER,
+L"left\0", 0x00000001L, MCI_INTEGER,
+L"right\0", 0x00000002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"video\0", 0x00001000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"door open\0", 0x00000100L, MCI_FLAG,
+L"door closed\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"product\0", 0x00000100L, MCI_FLAG,
+L"upc\0", 0x00000400L, MCI_FLAG,
+L"identity\0", 0x00000800L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"\0", 0x00000000L, MCI_END_COMMAND_LIST
 END
 
 SEQUENCER RCDATA
 BEGIN
-"status\0", 0x00000814L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"position\0", 0x00000002L, MCI_INTEGER,
-"mode\0", 0x00000004L, MCI_INTEGER,
-"length\0", 0x00000001L, MCI_INTEGER,
-"number of tracks\0", 0x00000003L, MCI_INTEGER,
-"media present\0", 0x00000005L, MCI_INTEGER,
-"ready\0", 0x00000007L, MCI_INTEGER,
-"tempo\0", 0x00004002L, MCI_INTEGER,
-"port\0", 0x00004003L, MCI_INTEGER,
-"slave\0", 0x00004007L, MCI_INTEGER,
-"master\0", 0x00004008L, MCI_INTEGER,
-"offset\0", 0x00004009L, MCI_INTEGER,
-"division type\0", 0x0000400aL, MCI_INTEGER,
-"time format\0", 0x00000006L, MCI_INTEGER,
-"current track\0", 0x00000008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"track\0", 0x00000010L, MCI_INTEGER,
-"start\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"time format\0", 0x00000400L, MCI_CONSTANT,
-"milliseconds\0", 0x00000000L, MCI_INTEGER,
-"ms\0", 0x00000000L, MCI_INTEGER,
-"smpte 30 drop\0", 0x00000007L, MCI_INTEGER,
-"smpte 30\0", 0x00000006L, MCI_INTEGER,
-"smpte 25\0", 0x00000005L, MCI_INTEGER,
-"smpte 24\0", 0x00000004L, MCI_INTEGER,
-"song pointer\0", 0x00004001L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"audio\0", 0x00000800L, MCI_CONSTANT,
-"all\0", 0x00000000L, MCI_INTEGER,
-"left\0", 0x00000001L, MCI_INTEGER,
-"right\0", 0x00000002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"video\0", 0x00001000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"tempo\0", 0x00010000L, MCI_INTEGER,
-"port\0", 0x00020000L, MCI_CONSTANT,
-"none\0", 0x0000fffdL, MCI_INTEGER,
-"mapper\0", 0x0000ffffL, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"slave\0", 0x00040000L, MCI_CONSTANT,
-"smpte\0", 0x00004004L, MCI_INTEGER,
-"midi\0", 0x00004003L, MCI_INTEGER,
-"none\0", 0x0000fffdL, MCI_INTEGER,
-"file\0", 0x00004002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"master\0", 0x00080000L, MCI_CONSTANT,
-"smpte\0", 0x00004004L, MCI_INTEGER,
-"midi\0", 0x00004003L, MCI_INTEGER,
-"none\0", 0x0000fffdL, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"offset\0", 0x01000000L, MCI_INTEGER,
-"door open\0", 0x00000100L, MCI_FLAG,
-"door closed\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"product\0", 0x00000100L, MCI_FLAG,
-"file\0", 0x00000200L, MCI_FLAG,
-"name\0", 0x00001000L, MCI_FLAG,
-"copyright\0", 0x00002000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"\0", 0x00000000L, MCI_END_COMMAND_LIST
+L"status\0", 0x00000814L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"position\0", 0x00000002L, MCI_INTEGER,
+L"mode\0", 0x00000004L, MCI_INTEGER,
+L"length\0", 0x00000001L, MCI_INTEGER,
+L"number of tracks\0", 0x00000003L, MCI_INTEGER,
+L"media present\0", 0x00000005L, MCI_INTEGER,
+L"ready\0", 0x00000007L, MCI_INTEGER,
+L"tempo\0", 0x00004002L, MCI_INTEGER,
+L"port\0", 0x00004003L, MCI_INTEGER,
+L"slave\0", 0x00004007L, MCI_INTEGER,
+L"master\0", 0x00004008L, MCI_INTEGER,
+L"offset\0", 0x00004009L, MCI_INTEGER,
+L"division type\0", 0x0000400aL, MCI_INTEGER,
+L"time format\0", 0x00000006L, MCI_INTEGER,
+L"current track\0", 0x00000008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"track\0", 0x00000010L, MCI_INTEGER,
+L"start\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"time format\0", 0x00000400L, MCI_CONSTANT,
+L"milliseconds\0", 0x00000000L, MCI_INTEGER,
+L"ms\0", 0x00000000L, MCI_INTEGER,
+L"smpte 30 drop\0", 0x00000007L, MCI_INTEGER,
+L"smpte 30\0", 0x00000006L, MCI_INTEGER,
+L"smpte 25\0", 0x00000005L, MCI_INTEGER,
+L"smpte 24\0", 0x00000004L, MCI_INTEGER,
+L"song pointer\0", 0x00004001L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"audio\0", 0x00000800L, MCI_CONSTANT,
+L"all\0", 0x00000000L, MCI_INTEGER,
+L"left\0", 0x00000001L, MCI_INTEGER,
+L"right\0", 0x00000002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"video\0", 0x00001000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"tempo\0", 0x00010000L, MCI_INTEGER,
+L"port\0", 0x00020000L, MCI_CONSTANT,
+L"none\0", 0x0000fffdL, MCI_INTEGER,
+L"mapper\0", 0x0000ffffL, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"slave\0", 0x00040000L, MCI_CONSTANT,
+L"smpte\0", 0x00004004L, MCI_INTEGER,
+L"midi\0", 0x00004003L, MCI_INTEGER,
+L"none\0", 0x0000fffdL, MCI_INTEGER,
+L"file\0", 0x00004002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"master\0", 0x00080000L, MCI_CONSTANT,
+L"smpte\0", 0x00004004L, MCI_INTEGER,
+L"midi\0", 0x00004003L, MCI_INTEGER,
+L"none\0", 0x0000fffdL, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"offset\0", 0x01000000L, MCI_INTEGER,
+L"door open\0", 0x00000100L, MCI_FLAG,
+L"door closed\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"product\0", 0x00000100L, MCI_FLAG,
+L"file\0", 0x00000200L, MCI_FLAG,
+L"name\0", 0x00001000L, MCI_FLAG,
+L"copyright\0", 0x00002000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"\0", 0x00000000L, MCI_END_COMMAND_LIST
 END
 
 ANIMATION RCDATA
 BEGIN
-"open\0", 0x00000803L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"type\0", 0x00002000L, MCI_STRING,
-"element\0", 0x00000200L, MCI_STRING,
-"alias\0", 0x00000400L, MCI_STRING,
-"shareable\0", 0x00000100L, MCI_FLAG,
-"style\0", 0x00010000L, MCI_CONSTANT,
-"overlapped\0", 0x00cf0000L, MCI_INTEGER,
-"popup\0", 0x80880000L, MCI_INTEGER,
-"child\0", 0x40000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"parent\0", 0x00020000L, MCI_INTEGER,
-"nostatic\0", 0x00040000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"play\0", 0x00000806L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"from\0", 0x00000004L, MCI_INTEGER,
-"to\0", 0x00000008L, MCI_INTEGER,
-"fast\0", 0x00040000L, MCI_FLAG,
-"slow\0", 0x00080000L, MCI_FLAG,
-"scan\0", 0x00100000L, MCI_FLAG,
-"reverse\0", 0x00020000L, MCI_FLAG,
-"speed\0", 0x00010000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"step\0", 0x0000080eL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"reverse\0", 0x00010000L, MCI_FLAG,
-"by\0", 0x00020000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"time format\0", 0x00000400L, MCI_CONSTANT,
-"milliseconds\0", 0x00000000L, MCI_INTEGER,
-"ms\0", 0x00000000L, MCI_INTEGER,
-"frames\0", 0x00000003L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"audio\0", 0x00000800L, MCI_CONSTANT,
-"all\0", 0x00000000L, MCI_INTEGER,
-"left\0", 0x00000001L, MCI_INTEGER,
-"right\0", 0x00000002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"video\0", 0x00001000L, MCI_FLAG,
-"on\0", 0x00002000L, MCI_FLAG,
-"off\0", 0x00004000L, MCI_FLAG,
-"door open\0", 0x00000100L, MCI_FLAG,
-"door closed\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"status\0", 0x00000814L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"position\0", 0x00000002L, MCI_INTEGER,
-"length\0", 0x00000001L, MCI_INTEGER,
-"number of tracks\0", 0x00000003L, MCI_INTEGER,
-"mode\0", 0x00000004L, MCI_INTEGER,
-"ready\0", 0x00000007L, MCI_INTEGER,
-"speed\0", 0x00004001L, MCI_INTEGER,
-"forward\0", 0x00004002L, MCI_INTEGER,
-"window handle\0", 0x00004003L, MCI_INTEGER,
-"palette handle\0", 0x00004004L, MCI_INTEGER,
-"media present\0", 0x00000005L, MCI_INTEGER,
-"time format\0", 0x00000006L, MCI_INTEGER,
-"current track\0", 0x00000008L, MCI_INTEGER,
-"stretch\0", 0x00004005L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"track\0", 0x00000010L, MCI_INTEGER,
-"start\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"product\0", 0x00000100L, MCI_FLAG,
-"file\0", 0x00000200L, MCI_FLAG,
-"window text\0", 0x00010000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"can record\0", 0x00000001L, MCI_INTEGER,
-"has audio\0", 0x00000002L, MCI_INTEGER,
-"has video\0", 0x00000003L, MCI_INTEGER,
-"device type\0", 0x00000004L, MCI_INTEGER,
-"uses files\0", 0x00000005L, MCI_INTEGER,
-"compound device\0", 0x00000006L, MCI_INTEGER,
-"can eject\0", 0x00000007L, MCI_INTEGER,
-"can play\0", 0x00000008L, MCI_INTEGER,
-"can save\0", 0x00000009L, MCI_INTEGER,
-"can reverse\0", 0x00004001L, MCI_INTEGER,
-"fast play rate\0", 0x00004002L, MCI_INTEGER,
-"slow play rate\0", 0x00004003L, MCI_INTEGER,
-"normal play rate\0", 0x00004004L, MCI_INTEGER,
-"uses palettes\0", 0x00004006L, MCI_INTEGER,
-"can stretch\0", 0x00004007L, MCI_INTEGER,
-"windows\0", 0x00004008L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"realize\0", 0x00000840L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"normal\0", 0x00010000L, MCI_FLAG,
-"background\0", 0x00020000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"window\0", 0x00000841L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"handle\0", 0x00010000L, MCI_CONSTANT,
-"default\0", 0x00000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"state\0", 0x00040000L, MCI_CONSTANT,
-"hide\0", 0x00000000L, MCI_INTEGER,
-"minimize\0", 0x00000006L, MCI_INTEGER,
-"show\0", 0x00000005L, MCI_INTEGER,
-"maximized\0", 0x00000003L, MCI_INTEGER,
-"minimized\0", 0x00000002L, MCI_INTEGER,
-"iconic\0", 0x00000007L, MCI_INTEGER,
-"no action\0", 0x00000008L, MCI_INTEGER,
-"no activate\0", 0x00000004L, MCI_INTEGER,
-"normal\0", 0x00000001L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"text\0", 0x00080000L, MCI_STRING,
-"stretch\0", 0x00100000L, MCI_FLAG,
-"fixed\0", 0x00200000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"put\0", 0x00000842L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"source\0", 0x00020000L, MCI_FLAG,
-"destination\0", 0x00040000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"where\0", 0x00000843L, MCI_COMMAND_HEAD,
-"\0", 0x00000007L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"source\0", 0x00020000L, MCI_FLAG,
-"destination\0", 0x00040000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"update\0", 0x00000854L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"hdc\0", 0x00020000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"\0", 0x00000000L, MCI_END_COMMAND_LIST
+L"open\0", 0x00000803L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"type\0", 0x00002000L, MCI_STRING,
+L"element\0", 0x00000200L, MCI_STRING,
+L"alias\0", 0x00000400L, MCI_STRING,
+L"shareable\0", 0x00000100L, MCI_FLAG,
+L"style\0", 0x00010000L, MCI_CONSTANT,
+L"overlapped\0", 0x00cf0000L, MCI_INTEGER,
+L"popup\0", 0x80880000L, MCI_INTEGER,
+L"child\0", 0x40000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"parent\0", 0x00020000L, MCI_INTEGER,
+L"nostatic\0", 0x00040000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"play\0", 0x00000806L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"from\0", 0x00000004L, MCI_INTEGER,
+L"to\0", 0x00000008L, MCI_INTEGER,
+L"fast\0", 0x00040000L, MCI_FLAG,
+L"slow\0", 0x00080000L, MCI_FLAG,
+L"scan\0", 0x00100000L, MCI_FLAG,
+L"reverse\0", 0x00020000L, MCI_FLAG,
+L"speed\0", 0x00010000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"step\0", 0x0000080eL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"reverse\0", 0x00010000L, MCI_FLAG,
+L"by\0", 0x00020000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"set\0", 0x0000080dL, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"time format\0", 0x00000400L, MCI_CONSTANT,
+L"milliseconds\0", 0x00000000L, MCI_INTEGER,
+L"ms\0", 0x00000000L, MCI_INTEGER,
+L"frames\0", 0x00000003L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"audio\0", 0x00000800L, MCI_CONSTANT,
+L"all\0", 0x00000000L, MCI_INTEGER,
+L"left\0", 0x00000001L, MCI_INTEGER,
+L"right\0", 0x00000002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"video\0", 0x00001000L, MCI_FLAG,
+L"on\0", 0x00002000L, MCI_FLAG,
+L"off\0", 0x00004000L, MCI_FLAG,
+L"door open\0", 0x00000100L, MCI_FLAG,
+L"door closed\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"status\0", 0x00000814L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"position\0", 0x00000002L, MCI_INTEGER,
+L"length\0", 0x00000001L, MCI_INTEGER,
+L"number of tracks\0", 0x00000003L, MCI_INTEGER,
+L"mode\0", 0x00000004L, MCI_INTEGER,
+L"ready\0", 0x00000007L, MCI_INTEGER,
+L"speed\0", 0x00004001L, MCI_INTEGER,
+L"forward\0", 0x00004002L, MCI_INTEGER,
+L"window handle\0", 0x00004003L, MCI_INTEGER,
+L"palette handle\0", 0x00004004L, MCI_INTEGER,
+L"media present\0", 0x00000005L, MCI_INTEGER,
+L"time format\0", 0x00000006L, MCI_INTEGER,
+L"current track\0", 0x00000008L, MCI_INTEGER,
+L"stretch\0", 0x00004005L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"track\0", 0x00000010L, MCI_INTEGER,
+L"start\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"product\0", 0x00000100L, MCI_FLAG,
+L"file\0", 0x00000200L, MCI_FLAG,
+L"window text\0", 0x00010000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"can record\0", 0x00000001L, MCI_INTEGER,
+L"has audio\0", 0x00000002L, MCI_INTEGER,
+L"has video\0", 0x00000003L, MCI_INTEGER,
+L"device type\0", 0x00000004L, MCI_INTEGER,
+L"uses files\0", 0x00000005L, MCI_INTEGER,
+L"compound device\0", 0x00000006L, MCI_INTEGER,
+L"can eject\0", 0x00000007L, MCI_INTEGER,
+L"can play\0", 0x00000008L, MCI_INTEGER,
+L"can save\0", 0x00000009L, MCI_INTEGER,
+L"can reverse\0", 0x00004001L, MCI_INTEGER,
+L"fast play rate\0", 0x00004002L, MCI_INTEGER,
+L"slow play rate\0", 0x00004003L, MCI_INTEGER,
+L"normal play rate\0", 0x00004004L, MCI_INTEGER,
+L"uses palettes\0", 0x00004006L, MCI_INTEGER,
+L"can stretch\0", 0x00004007L, MCI_INTEGER,
+L"windows\0", 0x00004008L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"realize\0", 0x00000840L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"normal\0", 0x00010000L, MCI_FLAG,
+L"background\0", 0x00020000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"window\0", 0x00000841L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"handle\0", 0x00010000L, MCI_CONSTANT,
+L"default\0", 0x00000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"state\0", 0x00040000L, MCI_CONSTANT,
+L"hide\0", 0x00000000L, MCI_INTEGER,
+L"minimize\0", 0x00000006L, MCI_INTEGER,
+L"show\0", 0x00000005L, MCI_INTEGER,
+L"maximized\0", 0x00000003L, MCI_INTEGER,
+L"minimized\0", 0x00000002L, MCI_INTEGER,
+L"iconic\0", 0x00000007L, MCI_INTEGER,
+L"no action\0", 0x00000008L, MCI_INTEGER,
+L"no activate\0", 0x00000004L, MCI_INTEGER,
+L"normal\0", 0x00000001L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"text\0", 0x00080000L, MCI_STRING,
+L"stretch\0", 0x00100000L, MCI_FLAG,
+L"fixed\0", 0x00200000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"put\0", 0x00000842L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"source\0", 0x00020000L, MCI_FLAG,
+L"destination\0", 0x00040000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"where\0", 0x00000843L, MCI_COMMAND_HEAD,
+L"\0", 0x00000007L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"source\0", 0x00020000L, MCI_FLAG,
+L"destination\0", 0x00040000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"update\0", 0x00000854L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"hdc\0", 0x00020000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"\0", 0x00000000L, MCI_END_COMMAND_LIST
 END
 
 OVERLAY RCDATA
 BEGIN
-"open\0", 0x00000803L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"type\0", 0x00002000L, MCI_STRING,
-"element\0", 0x00000200L, MCI_STRING,
-"alias\0", 0x00000400L, MCI_STRING,
-"shareable\0", 0x00000100L, MCI_FLAG,
-"style\0", 0x00010000L, MCI_CONSTANT,
-"overlapped\0", 0x00cf0000L, MCI_INTEGER,
-"popup\0", 0x80880000L, MCI_INTEGER,
-"child\0", 0x40000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"parent\0", 0x00020000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"status\0", 0x00000814L, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"position\0", 0x00000002L, MCI_INTEGER,
-"length\0", 0x00000001L, MCI_INTEGER,
-"number of tracks\0", 0x00000003L, MCI_INTEGER,
-"mode\0", 0x00000004L, MCI_INTEGER,
-"ready\0", 0x00000007L, MCI_INTEGER,
-"window handle\0", 0x00004001L, MCI_INTEGER,
-"media present\0", 0x00000005L, MCI_INTEGER,
-"stretch\0", 0x00004002L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"track\0", 0x00000010L, MCI_INTEGER,
-"start\0", 0x00000200L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
-"\0", 0x00000001L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"product\0", 0x00000100L, MCI_FLAG,
-"file\0", 0x00000200L, MCI_FLAG,
-"window text\0", 0x00010000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
-"\0", 0x00000002L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_CONSTANT,
-"can record\0", 0x00000001L, MCI_INTEGER,
-"has audio\0", 0x00000002L, MCI_INTEGER,
-"has video\0", 0x00000003L, MCI_INTEGER,
-"device type\0", 0x00000004L, MCI_INTEGER,
-"uses files\0", 0x00000005L, MCI_INTEGER,
-"compound device\0", 0x00000006L, MCI_INTEGER,
-"can eject\0", 0x00000007L, MCI_INTEGER,
-"can play\0", 0x00000008L, MCI_INTEGER,
-"can save\0", 0x00000009L, MCI_INTEGER,
-"can stretch\0", 0x00004001L, MCI_INTEGER,
-"can freeze\0", 0x00004002L, MCI_INTEGER,
-"windows\0", 0x00004003L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"window\0", 0x00000841L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"handle\0", 0x00010000L, MCI_CONSTANT,
-"default\0", 0x00000000L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"state\0", 0x00040000L, MCI_CONSTANT,
-"hide\0", 0x00000000L, MCI_INTEGER,
-"minimize\0", 0x00000006L, MCI_INTEGER,
-"show\0", 0x00000005L, MCI_INTEGER,
-"maximized\0", 0x00000003L, MCI_INTEGER,
-"minimized\0", 0x00000002L, MCI_INTEGER,
-"iconic\0", 0x00000007L, MCI_INTEGER,
-"no action\0", 0x00000008L, MCI_INTEGER,
-"no activate\0", 0x00000004L, MCI_INTEGER,
-"normal\0", 0x00000001L, MCI_INTEGER,
-"\0", 0x00000000L, MCI_END_CONSTANT,
-"text\0", 0x00080000L, MCI_STRING,
-"stretch\0", 0x00100000L, MCI_FLAG,
-"fixed\0", 0x00200000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"put\0", 0x00000842L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"source\0", 0x00020000L, MCI_FLAG,
-"destination\0", 0x00040000L, MCI_FLAG,
-"frame\0", 0x00080000L, MCI_FLAG,
-"video\0", 0x00100000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"where\0", 0x00000843L, MCI_COMMAND_HEAD,
-"\0", 0x00000007L, MCI_RETURN,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"source\0", 0x00020000L, MCI_FLAG,
-"destination\0", 0x00040000L, MCI_FLAG,
-"frame\0", 0x00080000L, MCI_FLAG,
-"video\0", 0x00100000L, MCI_FLAG,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"save\0", 0x00000813L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_STRING,
-"at\0", 0x00010000L, MCI_RECT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"load\0", 0x00000850L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"\0", 0x00000100L, MCI_STRING,
-"at\0", 0x00010000L, MCI_RECT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"freeze\0", 0x00000844L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"unfreeze\0", 0x00000845L, MCI_COMMAND_HEAD,
-"notify\0", 0x00000001L, MCI_FLAG,
-"wait\0", 0x00000002L, MCI_FLAG,
-"at\0", 0x00010000L, MCI_RECT,
-"\0", 0x00000000L, MCI_END_COMMAND,
-"\0", 0x00000000L, MCI_END_COMMAND_LIST
+L"open\0", 0x00000803L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"type\0", 0x00002000L, MCI_STRING,
+L"element\0", 0x00000200L, MCI_STRING,
+L"alias\0", 0x00000400L, MCI_STRING,
+L"shareable\0", 0x00000100L, MCI_FLAG,
+L"style\0", 0x00010000L, MCI_CONSTANT,
+L"overlapped\0", 0x00cf0000L, MCI_INTEGER,
+L"popup\0", 0x80880000L, MCI_INTEGER,
+L"child\0", 0x40000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"parent\0", 0x00020000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"status\0", 0x00000814L, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"position\0", 0x00000002L, MCI_INTEGER,
+L"length\0", 0x00000001L, MCI_INTEGER,
+L"number of tracks\0", 0x00000003L, MCI_INTEGER,
+L"mode\0", 0x00000004L, MCI_INTEGER,
+L"ready\0", 0x00000007L, MCI_INTEGER,
+L"window handle\0", 0x00004001L, MCI_INTEGER,
+L"media present\0", 0x00000005L, MCI_INTEGER,
+L"stretch\0", 0x00004002L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"track\0", 0x00000010L, MCI_INTEGER,
+L"start\0", 0x00000200L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"info\0", 0x0000080aL, MCI_COMMAND_HEAD,
+L"\0", 0x00000001L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"product\0", 0x00000100L, MCI_FLAG,
+L"file\0", 0x00000200L, MCI_FLAG,
+L"window text\0", 0x00010000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"capability\0", 0x0000080bL, MCI_COMMAND_HEAD,
+L"\0", 0x00000002L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_CONSTANT,
+L"can record\0", 0x00000001L, MCI_INTEGER,
+L"has audio\0", 0x00000002L, MCI_INTEGER,
+L"has video\0", 0x00000003L, MCI_INTEGER,
+L"device type\0", 0x00000004L, MCI_INTEGER,
+L"uses files\0", 0x00000005L, MCI_INTEGER,
+L"compound device\0", 0x00000006L, MCI_INTEGER,
+L"can eject\0", 0x00000007L, MCI_INTEGER,
+L"can play\0", 0x00000008L, MCI_INTEGER,
+L"can save\0", 0x00000009L, MCI_INTEGER,
+L"can stretch\0", 0x00004001L, MCI_INTEGER,
+L"can freeze\0", 0x00004002L, MCI_INTEGER,
+L"windows\0", 0x00004003L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"window\0", 0x00000841L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"handle\0", 0x00010000L, MCI_CONSTANT,
+L"default\0", 0x00000000L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"state\0", 0x00040000L, MCI_CONSTANT,
+L"hide\0", 0x00000000L, MCI_INTEGER,
+L"minimize\0", 0x00000006L, MCI_INTEGER,
+L"show\0", 0x00000005L, MCI_INTEGER,
+L"maximized\0", 0x00000003L, MCI_INTEGER,
+L"minimized\0", 0x00000002L, MCI_INTEGER,
+L"iconic\0", 0x00000007L, MCI_INTEGER,
+L"no action\0", 0x00000008L, MCI_INTEGER,
+L"no activate\0", 0x00000004L, MCI_INTEGER,
+L"normal\0", 0x00000001L, MCI_INTEGER,
+L"\0", 0x00000000L, MCI_END_CONSTANT,
+L"text\0", 0x00080000L, MCI_STRING,
+L"stretch\0", 0x00100000L, MCI_FLAG,
+L"fixed\0", 0x00200000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"put\0", 0x00000842L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"source\0", 0x00020000L, MCI_FLAG,
+L"destination\0", 0x00040000L, MCI_FLAG,
+L"frame\0", 0x00080000L, MCI_FLAG,
+L"video\0", 0x00100000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"where\0", 0x00000843L, MCI_COMMAND_HEAD,
+L"\0", 0x00000007L, MCI_RETURN,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"source\0", 0x00020000L, MCI_FLAG,
+L"destination\0", 0x00040000L, MCI_FLAG,
+L"frame\0", 0x00080000L, MCI_FLAG,
+L"video\0", 0x00100000L, MCI_FLAG,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"save\0", 0x00000813L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_STRING,
+L"at\0", 0x00010000L, MCI_RECT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"load\0", 0x00000850L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"\0", 0x00000100L, MCI_STRING,
+L"at\0", 0x00010000L, MCI_RECT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"freeze\0", 0x00000844L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"unfreeze\0", 0x00000845L, MCI_COMMAND_HEAD,
+L"notify\0", 0x00000001L, MCI_FLAG,
+L"wait\0", 0x00000002L, MCI_FLAG,
+L"at\0", 0x00010000L, MCI_RECT,
+L"\0", 0x00000000L, MCI_END_COMMAND,
+L"\0", 0x00000000L, MCI_END_COMMAND_LIST
 END
 
 STRINGTABLE
diff --git a/include/mmsystem.h b/include/mmsystem.h
index a9f6e09..09620aa 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -1649,21 +1649,25 @@
 
 typedef UINT (CALLBACK *YIELDPROC)(MCIDEVICEID,DWORD);
 
-DWORD          WINAPI  mciSendCommandA(MCIDEVICEID,UINT,DWORD_PTR,DWORD_PTR);
-DWORD          WINAPI  mciSendCommandW(MCIDEVICEID,UINT,DWORD_PTR,DWORD_PTR);
+BOOL            WINAPI  mciExecute(LPCSTR);
+DWORD           WINAPI  mciSendCommandA(MCIDEVICEID,UINT,DWORD_PTR,DWORD_PTR);
+DWORD           WINAPI  mciSendCommandW(MCIDEVICEID,UINT,DWORD_PTR,DWORD_PTR);
 #define 		mciSendCommand WINELIB_NAME_AW(mciSendCommand)
 DWORD		WINAPI	mciSendStringA(LPCSTR,LPSTR,UINT,HWND);
 DWORD		WINAPI	mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND);
 #define 		mciSendString WINELIB_NAME_AW(mciSendString)
-UINT		WINAPI	mciGetDeviceIDA(LPCSTR);
-UINT		WINAPI	mciGetDeviceIDW(LPCWSTR);
+MCIDEVICEID	WINAPI	mciGetDeviceIDA(LPCSTR);
+MCIDEVICEID	WINAPI	mciGetDeviceIDW(LPCWSTR);
 #define 		mciGetDeviceID WINELIB_NAME_AW(mciGetDeviceID)
-BOOL           WINAPI  mciGetErrorStringA(MCIERROR,LPSTR,UINT);
-BOOL           WINAPI  mciGetErrorStringW(MCIERROR,LPWSTR,UINT);
+MCIDEVICEID     WINAPI  mciGetDeviceIDFromElementIDA(DWORD,LPCSTR);
+MCIDEVICEID     WINAPI  mciGetDeviceIDFromElementIDW(DWORD,LPCWSTR);
+#define                 mciGetDeviceIDFromElementID WINELIB_NAME_AW(mciGetDeviceIDFromElementID)
+BOOL            WINAPI  mciGetErrorStringA(MCIERROR,LPSTR,UINT);
+BOOL            WINAPI  mciGetErrorStringW(MCIERROR,LPWSTR,UINT);
 #define 		mciGetErrorString WINELIB_NAME_AW(mciGetErrorString)
-BOOL           WINAPI  mciSetYieldProc(MCIDEVICEID,YIELDPROC,DWORD);
-HTASK          WINAPI  mciGetCreatorTask(MCIDEVICEID);
-YIELDPROC      WINAPI  mciGetYieldProc(MCIDEVICEID,DWORD*);
+BOOL            WINAPI  mciSetYieldProc(MCIDEVICEID,YIELDPROC,DWORD);
+HTASK           WINAPI  mciGetCreatorTask(MCIDEVICEID);
+YIELDPROC       WINAPI  mciGetYieldProc(MCIDEVICEID,DWORD*);
 
 #define MCIERR_INVALID_DEVICE_ID        (MCIERR_BASE + 1)
 #define MCIERR_UNRECOGNIZED_KEYWORD     (MCIERR_BASE + 3)
@@ -1971,15 +1975,15 @@
 } MCI_STATUS_PARMS, *LPMCI_STATUS_PARMS;
 
 typedef struct tagMCI_INFO_PARMSA {
-       DWORD_PTR dwCallback;
-	LPSTR   lpstrReturn;
-	DWORD   dwRetSize;
+    DWORD_PTR   dwCallback;
+    LPSTR       lpstrReturn;
+    DWORD       dwRetSize;
 } MCI_INFO_PARMSA, *LPMCI_INFO_PARMSA;
 
 typedef struct tagMCI_INFO_PARMSW {
-       DWORD_PTR dwCallback;
-	LPSTR   lpstrReturn;
-	DWORD   dwRetSize;
+    DWORD_PTR   dwCallback;
+    LPWSTR      lpstrReturn;
+    DWORD       dwRetSize;
 } MCI_INFO_PARMSW, *LPMCI_INFO_PARMSW;
 
 DECL_WINELIB_TYPE_AW(MCI_INFO_PARMS)
@@ -1991,20 +1995,20 @@
 	DWORD   dwItem;
 } MCI_GETDEVCAPS_PARMS, *LPMCI_GETDEVCAPS_PARMS;
 
-typedef struct tagMCI_GETDEVCAPS_PARMSA {
-       DWORD_PTR dwCallback;
-	LPSTR	lpstrReturn;
-	DWORD	dwRetSize;
-	DWORD	dwNumber;
-	UINT	wDeviceType;
+typedef struct tagMCI_SYSINFO_PARMSA {
+    DWORD_PTR   dwCallback;
+    LPSTR	lpstrReturn;
+    DWORD	dwRetSize;
+    DWORD	dwNumber;
+    UINT	wDeviceType;
 } MCI_SYSINFO_PARMSA, *LPMCI_SYSINFO_PARMSA;
 
-typedef struct tagMCI_GETDEVCAPS_PARMSW {
-       DWORD_PTR dwCallback;
-	LPWSTR	lpstrReturn;
-	DWORD	dwRetSize;
-	DWORD	dwNumber;
-	UINT	wDeviceType;
+typedef struct tagMCI_SYSINFO_PARMSW {
+    DWORD_PTR   dwCallback;
+    LPWSTR	lpstrReturn;
+    DWORD	dwRetSize;
+    DWORD	dwNumber;
+    UINT	wDeviceType;
 } MCI_SYSINFO_PARMSW, *LPMCI_SYSINFO_PARMSW;
 
 DECL_WINELIB_TYPE_AW(MCI_SYSINFO_PARMS)
@@ -2023,15 +2027,31 @@
 } MCI_BREAK_PARMS, *LPMCI_BREAK_PARMS;
 
 
-typedef struct tagMCI_SOUND_PARMS {
-       DWORD_PTR dwCallback;
-	LPCSTR  lpstrSoundName;
-} MCI_SOUND_PARMS, *LPMCI_SOUND_PARMS;
+typedef struct tagMCI_SOUND_PARMSA {
+    DWORD_PTR   dwCallback;
+    LPCSTR      lpstrSoundName;
+} MCI_SOUND_PARMSA, *LPMCI_SOUND_PARMSA;
 
-typedef struct tagMCI_SAVE_PARMS {
-       DWORD_PTR dwCallback;
-	LPCSTR  lpfilename;
-} MCI_SAVE_PARMS, *LPMCI_SAVE_PARMS;
+typedef struct tagMCI_SOUND_PARMSW {
+    DWORD_PTR   dwCallback;
+    LPCWSTR     lpstrSoundName;
+} MCI_SOUND_PARMSW, *LPMCI_SOUND_PARMSW;
+
+DECL_WINELIB_TYPE_AW(MCI_SOUND_PARMS);
+DECL_WINELIB_TYPE_AW(LPMCI_SOUND_PARMS);
+
+typedef struct tagMCI_SAVE_PARMSA {
+    DWORD_PTR dwCallback;
+    LPCSTR  lpfilename;
+} MCI_SAVE_PARMSA, *LPMCI_SAVE_PARMSA;
+
+typedef struct tagMCI_SAVE_PARMSW {
+    DWORD_PTR dwCallback;
+    LPCWSTR  lpfilename;
+} MCI_SAVE_PARMSW, *LPMCI_SAVE_PARMSW;
+
+DECL_WINELIB_TYPE_AW(MCI_SAVE_PARMS);
+DECL_WINELIB_TYPE_AW(LPMCI_SAVE_PARMS);
 
 typedef struct tagMCI_LOAD_PARMSA {
        DWORD_PTR dwCallback;