- renamed winmm.OpenDriverW into winmm.OpenDriver
- replaced all inter-DLL calls (msacm and msvideo) to OpenDriverA with
  OpenDriver (unicode form)
- as a consequence, driver name handling in msacm is now mostly
  unicode
- moved UserYield16 and UnMapLS call out of the 32bit part of winmm

diff --git a/dlls/msacm/driver.c b/dlls/msacm/driver.c
index ef8b93c..b4b3f9c 100644
--- a/dlls/msacm/driver.c
+++ b/dlls/msacm/driver.c
@@ -292,15 +292,12 @@
         len = strlen("Drivers32") + 1;
         adod.pszSectionName = HeapAlloc(MSACM_hHeap, 0, len * sizeof(WCHAR));
         MultiByteToWideChar(CP_ACP, 0, "Drivers32", -1, (LPWSTR)adod.pszSectionName, len);
-        len = strlen(padid->pszDriverAlias) + 1;
-        adod.pszAliasName = HeapAlloc(MSACM_hHeap, 0, len * sizeof(WCHAR));
-        MultiByteToWideChar(CP_ACP, 0, padid->pszDriverAlias, -1, (LPWSTR)adod.pszAliasName, len);
+        adod.pszAliasName = padid->pszDriverAlias;
         adod.dnDevNode = 0;
 
-        pad->hDrvr = OpenDriverA(padid->pszDriverAlias, NULL, (DWORD)&adod);
+        pad->hDrvr = OpenDriver(padid->pszDriverAlias, NULL, (DWORD)&adod);
 
         HeapFree(MSACM_hHeap, 0, (LPWSTR)adod.pszSectionName);
-        HeapFree(MSACM_hHeap, 0, (LPWSTR)adod.pszAliasName);
         if (!pad->hDrvr)
         {
             ret = adod.dwError;
@@ -314,7 +311,7 @@
 
     /* FIXME: Create a WINE_ACMDRIVER32 */
     *phad = (HACMDRIVER)pad;
-    TRACE("'%s' => %08lx\n", padid->pszDriverAlias, (DWORD)pad);
+    TRACE("'%s' => %08lx\n", debugstr_w(padid->pszDriverAlias), (DWORD)pad);
 
     return MMSYSERR_NOERROR;
  gotError:
diff --git a/dlls/msacm/internal.c b/dlls/msacm/internal.c
index 5d41368..8e30f9b 100644
--- a/dlls/msacm/internal.c
+++ b/dlls/msacm/internal.c
@@ -34,6 +34,7 @@
 #include "msacmdrv.h"
 #include "wineacm.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msacm);
 
@@ -112,7 +113,7 @@
     for (ntag = 0; ntag < add.cFormatTags; ntag++) {
 	aftd.dwFormatTagIndex = ntag;
 	if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, (LPARAM)&aftd, ACM_FORMATTAGDETAILSF_INDEX)) {
-	    TRACE("IIOs (%s)\n", padid->pszDriverAlias);
+	    TRACE("IIOs (%s)\n", debugstr_w(padid->pszDriverAlias));
 	    goto errCleanUp;
 	}
 	padid->aFormatTag[ntag].dwFormatTag = aftd.dwFormatTag;
@@ -133,23 +134,25 @@
 /***********************************************************************
  *           MSACM_GetRegistryKey
  */
-static	LPSTR	MSACM_GetRegistryKey(const WINE_ACMDRIVERID* padid)
+static	LPWSTR	MSACM_GetRegistryKey(const WINE_ACMDRIVERID* padid)
 {
-    static const char*	baseKey = "Software\\Microsoft\\AudioCompressionManager\\DriverCache\\";
-    LPSTR	ret;
+    static const WCHAR	baseKey[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
+                                     'A','u','d','i','o','C','o','m','p','r','e','s','s','i','o','n','M','a','n','a','g','e','r','\\',
+                                     'D','r','i','v','e','r','C','a','c','h','e','\\','\0'};
+    LPWSTR	ret;
     int		len;
 
     if (!padid->pszDriverAlias) {
 	ERR("No alias needed for registry entry\n");
 	return NULL;
     }
-    len = strlen(baseKey);
-    ret = HeapAlloc(MSACM_hHeap, 0, len + strlen(padid->pszDriverAlias) + 1);
+    len = strlenW(baseKey);
+    ret = HeapAlloc(MSACM_hHeap, 0, (len + strlenW(padid->pszDriverAlias) + 1) * sizeof(WCHAR));
     if (!ret) return NULL;
 
-    strcpy(ret, baseKey);
-    strcpy(ret + len, padid->pszDriverAlias);
-    CharLowerA(ret + len);
+    strcpyW(ret, baseKey);
+    strcpyW(ret + len, padid->pszDriverAlias);
+    CharLowerW(ret + len);
     return ret;
 }
 
@@ -158,7 +161,7 @@
  */
 static BOOL MSACM_ReadCache(PWINE_ACMDRIVERID padid)
 {
-    LPSTR	key = MSACM_GetRegistryKey(padid);
+    LPWSTR	key = MSACM_GetRegistryKey(padid);
     HKEY	hKey;
     DWORD	type, size;
 
@@ -166,7 +169,7 @@
 
     padid->aFormatTag = NULL;
 
-    if (RegCreateKeyA(HKEY_LOCAL_MACHINE, key, &hKey))
+    if (RegCreateKeyW(HKEY_LOCAL_MACHINE, key, &hKey))
 	goto errCleanUp;
 
     size = sizeof(padid->cFormatTags);
@@ -202,12 +205,12 @@
  */
 static	BOOL MSACM_WriteCache(PWINE_ACMDRIVERID padid)
 {
-    LPSTR	key = MSACM_GetRegistryKey(padid);
+    LPWSTR	key = MSACM_GetRegistryKey(padid);
     HKEY	hKey;
 
     if (!key) return FALSE;
 
-    if (RegCreateKeyA(HKEY_LOCAL_MACHINE, key, &hKey))
+    if (RegCreateKeyW(HKEY_LOCAL_MACHINE, key, &hKey))
 	goto errCleanUp;
 
     if (RegSetValueExA(hKey, "cFormatTags", 0, REG_DWORD, (void*)&padid->cFormatTags, sizeof(DWORD)))
@@ -231,12 +234,13 @@
 /***********************************************************************
  *           MSACM_RegisterDriver()
  */
-PWINE_ACMDRIVERID MSACM_RegisterDriver(LPSTR pszDriverAlias, LPSTR pszFileName,
+PWINE_ACMDRIVERID MSACM_RegisterDriver(LPWSTR pszDriverAlias, LPWSTR pszFileName,
 				       HINSTANCE hinstModule)
 {
     PWINE_ACMDRIVERID	padid;
 
-    TRACE("('%s', '%s', %p)\n", pszDriverAlias, pszFileName, hinstModule);
+    TRACE("(%s, %s, %p)\n", 
+          debugstr_w(pszDriverAlias), debugstr_w(pszFileName), hinstModule);
 
     padid = (PWINE_ACMDRIVERID) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID));
     padid->obj.dwType = WINE_ACMOBJ_DRIVERID;
@@ -244,14 +248,14 @@
     padid->pszDriverAlias = NULL;
     if (pszDriverAlias)
     {
-        padid->pszDriverAlias = HeapAlloc( MSACM_hHeap, 0, strlen(pszDriverAlias)+1 );
-        strcpy( padid->pszDriverAlias, pszDriverAlias );
+        padid->pszDriverAlias = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszDriverAlias)+1) * sizeof(WCHAR) );
+        strcpyW( padid->pszDriverAlias, pszDriverAlias );
     }
     padid->pszFileName = NULL;
     if (pszFileName)
     {
-        padid->pszFileName = HeapAlloc( MSACM_hHeap, 0, strlen(pszFileName)+1 );
-        strcpy( padid->pszFileName, pszFileName );
+        padid->pszFileName = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszFileName)+1) * sizeof(WCHAR) );
+        strcpyW( padid->pszFileName, pszFileName );
     }
     padid->hInstModule = hinstModule;
 
@@ -265,7 +269,7 @@
 	MSACM_pFirstACMDriverID = padid;
     /* disable the driver if we cannot load the cache */
     if (!MSACM_ReadCache(padid) && !MSACM_FillCache(padid)) {
-	WARN("Couldn't load cache for ACM driver (%s)\n", pszFileName);
+	WARN("Couldn't load cache for ACM driver (%s)\n", debugstr_w(pszFileName));
 	MSACM_UnregisterDriver(padid);
 	return NULL;
     }
@@ -277,8 +281,12 @@
  */
 void MSACM_RegisterAllDrivers(void)
 {
-    LPSTR pszBuffer;
+    LPWSTR pszBuffer;
     DWORD dwBufferLength;
+    static WCHAR msacm32[] = {'m','s','a','c','m','3','2','.','d','l','l','\0'};
+    static WCHAR msacmW[] = {'M','S','A','C','M','.'};
+    static WCHAR drv32[] = {'d','r','i','v','e','r','s','3','2','\0'};
+    static WCHAR sys[] = {'s','y','s','t','e','m','.','i','n','i','\0'};
 
     /* FIXME
      *  What if the user edits system.ini while the program is running?
@@ -291,26 +299,32 @@
     dwBufferLength = 1024;
 /* EPP 	GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini"); */
 
-    pszBuffer = (LPSTR) HeapAlloc(MSACM_hHeap, 0, dwBufferLength);
-    if (GetPrivateProfileSectionA("drivers32", pszBuffer, dwBufferLength, "system.ini")) {
-	char* s = pszBuffer;
-	while (*s) {
-	    if (!strncasecmp("MSACM.", s, 6)) {
-		char *s2 = s;
+    pszBuffer = (LPWSTR) HeapAlloc(MSACM_hHeap, 0, dwBufferLength * sizeof(WCHAR));
+    if (GetPrivateProfileSectionW(drv32, pszBuffer, dwBufferLength, sys))
+    {
+	LPWSTR s = pszBuffer, s2;
+
+	while (*s)
+        {
+            CharUpperBuffW(s, 6);
+            if (memcmp(s, msacmW, 6 * sizeof(WCHAR)) == 0)
+            {
+                s2 = s;
 		while (*s2 != '\0' && *s2 != '=') s2++;
-		if (*s2) {
+		if (*s2)
+                {
 		    *s2 = '\0';
 		    MSACM_RegisterDriver(s, s2 + 1, 0);
 		    *s2 = '=';
 		}
 	    }
-	    s += strlen(s) + 1; /* Either next char or \0 */
+	    s += strlenW(s) + 1; /* Either next char or \0 */
 	}
     }
 
     HeapFree(MSACM_hHeap, 0, pszBuffer);
 
-    MSACM_RegisterDriver("msacm32.dll", "msacm32.dll", 0);
+    MSACM_RegisterDriver(msacm32, msacm32, 0);
 }
 
 /***********************************************************************
diff --git a/dlls/msacm/stream.c b/dlls/msacm/stream.c
index 6509207..c9bac47 100644
--- a/dlls/msacm/stream.c
+++ b/dlls/msacm/stream.c
@@ -216,7 +216,7 @@
 		was->hAcmDriver = had;
 
 		ret = SendDriverMessage(wad->hDrvr, ACMDM_STREAM_OPEN, (DWORD)&was->drvInst, 0L);
-		TRACE("%s => %08x\n", wadi->pszDriverAlias, ret);
+		TRACE("%s => %08x\n", debugstr_w(wadi->pszDriverAlias), ret);
 		if (ret == MMSYSERR_NOERROR) {
 		    if (fdwOpen & ACM_STREAMOPENF_QUERY) {
 			acmDriverClose(had, 0L);
diff --git a/dlls/msacm/wineacm.h b/dlls/msacm/wineacm.h
index b9b4f72..702ab01 100644
--- a/dlls/msacm/wineacm.h
+++ b/dlls/msacm/wineacm.h
@@ -317,8 +317,8 @@
 typedef struct _WINE_ACMDRIVERID
 {
     WINE_ACMOBJ		obj;
-    LPSTR		pszDriverAlias;
-    LPSTR               pszFileName;
+    LPWSTR		pszDriverAlias;
+    LPWSTR              pszFileName;
     HINSTANCE		hInstModule;          /* NULL if global */
     PWINE_ACMDRIVER     pACMDriverList;
     PWINE_ACMDRIVERID   pNextACMDriverID;
@@ -337,7 +337,7 @@
 extern HANDLE MSACM_hHeap;
 extern PWINE_ACMDRIVERID MSACM_pFirstACMDriverID;
 extern PWINE_ACMDRIVERID MSACM_pLastACMDriverID;
-extern PWINE_ACMDRIVERID MSACM_RegisterDriver(LPSTR pszDriverAlias, LPSTR pszFileName,
+extern PWINE_ACMDRIVERID MSACM_RegisterDriver(LPWSTR pszDriverAlias, LPWSTR pszFileName,
 					      HINSTANCE hinstModule);
 extern void MSACM_RegisterAllDrivers(void);
 extern PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p);
diff --git a/dlls/msvideo/msvideo_main.c b/dlls/msvideo/msvideo_main.c
index 359ec03..c228a07 100644
--- a/dlls/msvideo/msvideo_main.c
+++ b/dlls/msvideo/msvideo_main.c
@@ -48,12 +48,13 @@
 static WINE_HIC*        MSVIDEO_FirstHic /* = NULL */;
 
 typedef struct _reg_driver reg_driver;
-struct _reg_driver{
-	DWORD fccType;
-	DWORD fccHandler;
-	DRIVERPROC proc;
-	char* name;
-	reg_driver* next;
+struct _reg_driver
+{
+    DWORD       fccType;
+    DWORD       fccHandler;
+    DRIVERPROC  proc;
+    LPWSTR      name;
+    reg_driver* next;
 };
 
 static reg_driver* reg_driver_list = NULL;
@@ -164,34 +165,37 @@
 BOOL VFWAPI ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDesc, UINT wFlags) 
 {
     reg_driver* driver;
+    unsigned len;
 
     TRACE("(%s,%s,%p,%p,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), (void*)lParam, szDesc, wFlags);
 
     /* Check if a driver is already registered */
-    driver = reg_driver_list;
-    while(driver)
+    for (driver = reg_driver_list; driver; driver = driver->next)
+    {
         if (!compare_fourcc(fccType, driver->fccType) &&
             !compare_fourcc(fccHandler, driver->fccHandler))
             break;
-        else
-            driver = driver->next;
-    if (driver)
-        return FALSE;
+    }
+    if (driver) return FALSE;
 
     /* Register the driver */
     driver = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(reg_driver));
+    if (!driver) goto oom;
     driver->fccType = fccType;
     driver->fccHandler = fccHandler;
 
-    switch(wFlags) {
+    switch(wFlags)
+    {
     case ICINSTALL_FUNCTION:
         driver->proc = (DRIVERPROC)lParam;
 	driver->name = NULL;
         break;
     case ICINSTALL_DRIVER:
 	driver->proc = NULL;
-	driver->name = HeapAlloc(GetProcessHeap(), 0, strlen((char*)lParam));
-	strcpy(driver->name, (char*) lParam);
+        len = MultiByteToWideChar(CP_ACP, 0, (char*)lParam, -1, NULL, 0);
+        driver->name = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+        if (!driver->name) goto oom;
+        MultiByteToWideChar(CP_ACP, 0, (char*)lParam, -1, driver->name, len);
 	break;
     default:
 	ERR("Invalid flags!\n");
@@ -204,6 +208,9 @@
    reg_driver_list = driver;
     
    return TRUE;
+ oom:
+   if (driver) HeapFree(GetProcessHeap(), 0, driver);
+   return FALSE;
 }
 
 /***********************************************************************
@@ -211,30 +218,25 @@
  */
 BOOL VFWAPI ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags) 
 {
-    reg_driver* driver;
-    reg_driver** previous;
+    reg_driver** pdriver;
     
     TRACE("(%s,%s,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wFlags);
 
     /* Check if a driver is already registered */
-    driver = reg_driver_list;
-    previous = &reg_driver_list;
-    while(driver)
-        if (!compare_fourcc(fccType, driver->fccType) &&
-            !compare_fourcc(fccHandler, driver->fccHandler))
+    for (pdriver = &reg_driver_list; *pdriver; pdriver = &(*pdriver)->next)
+    {
+        if (!compare_fourcc(fccType, (*pdriver)->fccType) &&
+            !compare_fourcc(fccHandler, (*pdriver)->fccHandler))
             break;
-        else {
-            previous = &(driver->next);
-            driver = driver->next;
-        }
-    if (!driver)
+    }
+    if (!*pdriver)
         return FALSE;
 
     /* Remove the driver from the list */
-    *previous = driver->next;
-    if (driver->name)
-        HeapFree(GetProcessHeap(), 0, driver->name);
-    HeapFree(GetProcessHeap(), 0, driver);
+    *pdriver = (*pdriver)->next;
+    if ((*pdriver)->name)
+        HeapFree(GetProcessHeap(), 0, (*pdriver)->name);
+    HeapFree(GetProcessHeap(), 0, *pdriver);
     
     return TRUE;  
 }
@@ -246,11 +248,12 @@
  */
 HIC VFWAPI ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode) 
 {
-    char		codecname[10];
+    WCHAR		codecname[10];
     ICOPEN		icopen;
     HDRVR		hdrv;
     WINE_HIC*           whic;
     BOOL                bIs16;
+    static WCHAR        drv32W[] = {'d','r','i','v','e','r','s','3','2','\0'};
     reg_driver*         driver;
 
     TRACE("(%s,%s,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wMode);
@@ -294,7 +297,7 @@
         codecname[8] = HIBYTE(HIWORD(fccHandler));
         codecname[9] = '\0';
 
-        hdrv = OpenDriverA(codecname, "drivers32", (LPARAM)&icopen);
+        hdrv = OpenDriver(codecname, drv32W, (LPARAM)&icopen);
         if (!hdrv) 
         {
             if (fccType == streamtypeVIDEO) 
@@ -305,14 +308,14 @@
                 codecname[3] = 'c';
 
 		fccType = ICTYPE_VIDEO;
-                hdrv = OpenDriverA(codecname, "drivers32", (LPARAM)&icopen);   
+                hdrv = OpenDriver(codecname, drv32W, (LPARAM)&icopen);
 	    }
             if (!hdrv)
                 return 0;
 	}
     } else {
         /* The driver has been registered at runtime with its name */
-        hdrv = OpenDriverA(driver->name, NULL, (LPARAM)&icopen);
+        hdrv = OpenDriver(driver->name, NULL, (LPARAM)&icopen);
         if (!hdrv) 
             return 0; 
     }
diff --git a/dlls/winmm/mmio.c b/dlls/winmm/mmio.c
index f4300ba..b835d26 100644
--- a/dlls/winmm/mmio.c
+++ b/dlls/winmm/mmio.c
@@ -261,7 +261,7 @@
     struct IOProcList*  pListNode;
     struct IOProcList** ppListNode;
 
-    TRACE("(%ld, %p, %08lX, %i)\n", fccIOProc, pIOProc, dwFlags, type);
+    TRACE("(%08lx, %p, %08lX, %i)\n", fccIOProc, pIOProc, dwFlags, type);
 
     if (dwFlags & MMIO_GLOBALPROC)
 	FIXME("Global procedures not implemented\n");
@@ -529,14 +529,16 @@
     wm->info.pchEndRead = wm->info.pchBuffer;
     wm->info.pchEndWrite = wm->info.pchBuffer + wm->info.cchBuffer;
 
+    wm->bBufferLoaded = TRUE;
     if (for_read) {
 	size = send_message(wm->ioProc, &wm->info, MMIOM_READ, 
                             (LPARAM)wm->info.pchBuffer, size, MMIO_PROC_32A);
 	if (size > 0)
 	    wm->info.pchEndRead += size;
+        else
+            wm->bBufferLoaded = FALSE;
     }
 
-    wm->bBufferLoaded = TRUE;
     return size;
 }
 
@@ -562,13 +564,6 @@
 	wm->info.dwFlags &= ~MMIO_ALLOCBUF;
     }
 
-    /* free segmented ptr mapping, if any */
-    if (wm->info.dwReserved1 != 0L)
-    {
-        UnMapLS(wm->info.dwReserved1);
-        wm->info.dwReserved1 = 0L;
-    }
-
     if (pchBuffer) {
         wm->info.pchBuffer = pchBuffer;
     } else if (cchBuffer) {
diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c
index 0ef0ca3..df465f7 100644
--- a/dlls/winmm/mmsystem.c
+++ b/dlls/winmm/mmsystem.c
@@ -4,7 +4,7 @@
  * MMSYTEM functions
  *
  * Copyright 1993      Martin Ayotte
- *           1998-2002 Eric Pouech
+ *           1998-2003 Eric Pouech
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -26,10 +26,6 @@
  *  	99/4	added mmTask and mmThread functions support
  */
 
-/* FIXME: I think there are some segmented vs. linear pointer weirdnesses
- *        and long term pointers to 16 bit space in here
- */
-
 #include <string.h>
 
 #define NONAMELESSUNION
@@ -2690,12 +2686,13 @@
  *             MMIO_ResetSegmentedData
  *
  */
-static LRESULT     MMIO_SetSegmentedBuffer(HMMIO hmmio, SEGPTR ptr)
+static LRESULT     MMIO_SetSegmentedBuffer(HMMIO hmmio, SEGPTR ptr, BOOL release)
 {
     LPWINE_MMIO		wm;
 
     if ((wm = MMIO_Get(hmmio)) == NULL)
 	return MMSYSERR_INVALHANDLE;
+    if (release) UnMapLS(wm->segBuffer16);
     wm->segBuffer16 = ptr;
     return MMSYSERR_NOERROR;
 }
@@ -2727,7 +2724,7 @@
 	mmioinfo.adwInfo[3]  = lpmmioinfo16->adwInfo[3];
 
 	ret = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, MMIO_PROC_16);
-        MMIO_SetSegmentedBuffer(mmioinfo.hmmio, (SEGPTR)lpmmioinfo16->pchBuffer);
+        MMIO_SetSegmentedBuffer(mmioinfo.hmmio, (SEGPTR)lpmmioinfo16->pchBuffer, FALSE);
 
 	lpmmioinfo16->wErrorRet = mmioinfo.wErrorRet;
         lpmmioinfo16->hmmio     = HMMIO_16(mmioinfo.hmmio);
@@ -2742,6 +2739,7 @@
  */
 MMRESULT16 WINAPI mmioClose16(HMMIO16 hmmio, UINT16 uFlags)
 {
+    MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), (SEGPTR)NULL, TRUE);
     return mmioClose(HMMIO_32(hmmio), uFlags);
 }
 
@@ -2854,7 +2852,9 @@
                                     cchBuffer, uFlags);
 
     if (ret == MMSYSERR_NOERROR)
-        MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), (DWORD)pchBuffer);
+        MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), (DWORD)pchBuffer, TRUE);
+    else
+        UnMapLS((DWORD)pchBuffer);
     return ret;
 }
 
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index b770164..9dacf9b 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -34,7 +34,7 @@
 #define NONAMELESSSTRUCT
 #include "mmsystem.h"
 #include "winbase.h"
-#include "wine/winuser16.h" /* FIXME: should be removed, only used for UserYield16 */
+#include "winuser.h"
 #include "heap.h"
 #include "winternl.h"
 #include "winemm.h"
@@ -43,6 +43,21 @@
 
 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();
+    }
+}
+
 /* ========================================================================
  *                   G L O B A L   S E T T I N G S
  * ========================================================================*/
@@ -812,7 +827,7 @@
 
     if ((HIWORD(data) != 0 && HWND_16(GetActiveWindow()) != HIWORD(data)) ||
 	(GetAsyncKeyState(LOWORD(data)) & 1) == 0) {
-	UserYield16();
+	MyUserYield();
 	ret = 0;
     } else {
 	MSG		msg;
@@ -906,7 +921,7 @@
     TRACE("(%04x)\n", uDeviceID);
 
     if (!(wmd = MCI_GetDriver(uDeviceID)) || !wmd->lpfnYieldProc || !wmd->bIs32) {
-	UserYield16();
+	MyUserYield();
     } else {
 	ret = wmd->lpfnYieldProc(uDeviceID, wmd->dwYieldData);
     }