diff -u wine.cvs/dlls/winmm/lolvldrv.c wine/dlls/winmm/lolvldrv.c
--- wine.cvs/dlls/winmm/lolvldrv.c	2003-10-24 07:57:35.000000000 -0400
+++ wine/dlls/winmm/lolvldrv.c	2003-10-26 15:04:56.000000000 -0500
@@ -494,6 +494,21 @@
     case DRV_QUERYMAPPABLE:
 	return (lpDrv->bIsMapper) ? 2 : 0;
 
+    case DRVM_MAPPER_PREFERRED_GET:
+	/* FIXME: get from registry someday */
+	if (bFrom32) {
+	    *((LPDWORD)dwParam1) = -1;      /* No preferred device */
+	    break;
+	}
+	return MMSYSERR_INVALPARAM;
+
+    case DRV_QUERYDEVICEINTERFACE:
+    case DRV_QUERYDEVICEINTERFACESIZE:
+	if (bFrom32)
+	    return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE);
+	
+	return MMSYSERR_INVALPARAM;
+
     case DRV_QUERYDSOUNDIFACE: /* Wine-specific: Retrieve DirectSound interface */
     case DRV_QUERYDSOUNDDESC: /* Wine-specific: Retrieve DirectSound driver description*/
     case DRV_QUERYDSOUNDGUID: /* Wine-specific: Retrieve DirectSound driver GUID */
diff -u wine.cvs/dlls/winmm/tests/wave.c wine/dlls/winmm/tests/wave.c
--- wine.cvs/dlls/winmm/tests/wave.c	2003-10-24 07:57:34.000000000 -0400
+++ wine/dlls/winmm/tests/wave.c	2003-10-26 15:04:56.000000000 -0500
@@ -22,11 +22,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
+#include <windows.h>
 
 #include "wine/test.h"
 #include "windef.h"
 #include "winbase.h"
 #include "mmsystem.h"
+#include "mmddk.h"
 
 /*
  * Note that in most of this test we may get MMSYSERR_BADDEVICEID errors
@@ -254,6 +256,9 @@
     HWAVEOUT wout;
     MMRESULT rc;
     UINT ndev,d,f;
+    WCHAR * wname;
+    CHAR * name=NULL;
+    DWORD size;                                                                                 
 
     ndev=waveOutGetNumDevs();
     trace("found %d WaveOut devices\n",ndev);
@@ -280,8 +285,20 @@
         if (rc==MMSYSERR_BADDEVICEID)
             continue;
 
-        trace("  %d: \"%s\" %d.%d (%d:%d): channels=%d formats=%05lx support=%04lx\n",
-              d,caps.szPname,caps.vDriverVersion >> 8,
+	rc=waveOutMessage((HWAVEOUT)d, DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0);
+	ok(rc==MMSYSERR_NOERROR, "waveOutMessage: failed to get interface size for device: %d rc=%d\n",d,rc);
+	if (rc==MMSYSERR_NOERROR) {
+	    wname = (WCHAR *)malloc(size);
+            rc=waveOutMessage((HWAVEOUT)d, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wname, size);
+	    ok(rc==MMSYSERR_NOERROR,"waveOutMessage: failed to get interface name for device:: %d rc=%d\n",d,rc);
+	    if (rc==MMSYSERR_NOERROR) {
+		name = malloc(size/sizeof(WCHAR));
+		WideCharToMultiByte(CP_ACP, 0, wname, size/sizeof(WCHAR), name, size/sizeof(WCHAR), NULL, NULL);
+	    }
+	}
+
+        trace("  %d: \"%s\" (%s) %d.%d (%d:%d): channels=%d formats=%05lx support=%04lx\n",
+              d,caps.szPname,name,caps.vDriverVersion >> 8,
               caps.vDriverVersion & 0xff,
               caps.wMid,caps.wPid,
               caps.wChannels,caps.dwFormats,caps.dwSupport);
@@ -425,6 +442,9 @@
     HWAVEIN win;
     MMRESULT rc;
     UINT ndev,d,f;
+    WCHAR * wname;
+    CHAR * name=NULL;
+    DWORD size;                                                                                 
 
     ndev=waveInGetNumDevs();
     trace("found %d WaveIn devices\n",ndev);
@@ -451,8 +471,20 @@
         if (rc==MMSYSERR_BADDEVICEID)
             continue;
 
-        trace("  %d: \"%s\" %d.%d (%d:%d): channels=%d formats=%05lx\n",
-              d,caps.szPname,caps.vDriverVersion >> 8,
+	rc=waveInMessage((HWAVEIN)d, DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0);
+	ok(rc==MMSYSERR_NOERROR, "waveInMessage: failed to get interface size for device: %d rc=%d\n",d,rc);
+	if (rc==MMSYSERR_NOERROR) {
+	    wname = (WCHAR *)malloc(size);
+            rc=waveInMessage((HWAVEIN)d, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wname, size);
+	    ok(rc==MMSYSERR_NOERROR,"waveInMessage: failed to get interface name for device:: %d rc=%d\n",d,rc);
+	    if (rc==MMSYSERR_NOERROR) {
+		name = malloc(size/sizeof(WCHAR));
+		WideCharToMultiByte(CP_ACP, 0, wname, size/sizeof(WCHAR), name, size/sizeof(WCHAR), NULL, NULL);
+	    }
+	}
+
+        trace("  %d: \"%s\" (%s) %d.%d (%d:%d): channels=%d formats=%05lx\n",
+              d,caps.szPname,name,caps.vDriverVersion >> 8,
               caps.vDriverVersion & 0xff,
               caps.wMid,caps.wPid,
               caps.wChannels,caps.dwFormats);
diff -u wine.cvs/dlls/winmm/wineoss/audio.c wine/dlls/winmm/wineoss/audio.c
--- wine.cvs/dlls/winmm/wineoss/audio.c	2003-10-24 07:57:35.000000000 -0400
+++ wine/dlls/winmm/wineoss/audio.c	2003-10-26 15:04:56.000000000 -0500
@@ -257,6 +257,27 @@
              (ossdev->bInputEnabled  ? PCM_ENABLE_INPUT  : 0) );
 }
 
+static DWORD wdDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
+{
+    TRACE("(%u, %p)\n", wDevID, dwParam1);
+
+    *dwParam1 = (strlen(OSS_Devices[wDevID].dev_name) + 1) * sizeof(WCHAR);
+    return MMSYSERR_NOERROR;
+}
+
+static DWORD wdDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
+{
+    int length = strlen(OSS_Devices[wDevID].dev_name) + 1;
+
+    if (dwParam2 >= (length * sizeof(WCHAR))) {
+	MultiByteToWideChar(CP_ACP, 0, OSS_Devices[wDevID].dev_name, length, 
+	    dwParam1, min(length, dwParam2 / sizeof(WCHAR)));
+	return MMSYSERR_NOERROR;
+    }
+
+    return MMSYSERR_INVALPARAM;
+}
+
 /*======================================================================*
  *                  Low level WAVE implementation			*
  *======================================================================*/
@@ -1947,6 +1968,8 @@
     case WODM_RESTART:		return wodRestart	(wDevID);
     case WODM_RESET:		return wodReset		(wDevID);
 
+    case DRV_QUERYDEVICEINTERFACESIZE: return wdDevInterfaceSize       (wDevID, (LPDWORD)dwParam1);
+    case DRV_QUERYDEVICEINTERFACE:     return wdDevInterface           (wDevID, (PWCHAR)dwParam1, dwParam2);
     case DRV_QUERYDSOUNDIFACE:	return wodDsCreate	(wDevID, (PIDSDRIVER*)dwParam1);
     case DRV_QUERYDSOUNDDESC:	return wodDsDesc	(wDevID, (PDSDRIVERDESC)dwParam1);
     case DRV_QUERYDSOUNDGUID:	return wodDsGuid	(wDevID, (LPGUID)dwParam1);
@@ -3138,6 +3161,8 @@
     case WIDM_RESET:		return widReset      (wDevID);
     case WIDM_START:		return widStart      (wDevID);
     case WIDM_STOP:		return widStop       (wDevID);
+    case DRV_QUERYDEVICEINTERFACESIZE: return wdDevInterfaceSize       (wDevID, (LPDWORD)dwParam1);
+    case DRV_QUERYDEVICEINTERFACE:     return wdDevInterface           (wDevID, (PWCHAR)dwParam1, dwParam2);
     case DRV_QUERYDSOUNDIFACE:	return widDsCreate   (wDevID, (PIDSCDRIVER*)dwParam1);
     case DRV_QUERYDSOUNDDESC:	return widDsDesc     (wDevID, (PDSDRIVERDESC)dwParam1);
     case DRV_QUERYDSOUNDGUID:	return widDsGuid     (wDevID, (LPGUID)dwParam1);
diff -u wine.cvs/dlls/winmm/winealsa/audio.c wine/dlls/winmm/winealsa/audio.c
--- wine.cvs/dlls/winmm/winealsa/audio.c	2003-10-24 07:57:34.000000000 -0400
+++ wine/dlls/winmm/winealsa/audio.c	2003-10-26 15:05:26.000000000 -0500
@@ -51,6 +51,7 @@
 #include "alsa.h"
 #include "wine/library.h"
 #include "wine/debug.h"
+#include "winnls.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(wave);
 
@@ -124,7 +125,7 @@
     WAVEOUTCAPSA		caps;
 
     /* ALSA information (ALSA 0.9/1.x uses two different devices for playback/capture) */
-    char *			device;
+    char			device[32];
     snd_pcm_t*                  p_handle;                 /* handle to ALSA playback device */
     snd_pcm_t*                  c_handle;                 /* handle to ALSA capture device */
     snd_pcm_hw_params_t *	hw_params;		/* ALSA Hw params */
@@ -414,7 +415,7 @@
     wwo = &WOutDev[0];
 
     /* FIXME: use better values */
-    wwo->device = FAKE_CHARPTR("hw");
+    strcpy(wwo->device, "hw");
     wwo->caps.wMid = 0x0002;
     wwo->caps.wPid = 0x0104;
     strcpy(wwo->caps.szPname, "SB16 Wave Out");
@@ -1595,6 +1596,31 @@
     return ALSA_WodNumDevs;
 }
 
+/**************************************************************************
+ * 				wodDevInterfaceSize		[internal]
+ */
+static DWORD wodDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
+{
+    TRACE("(%u, %p)\n", wDevID, dwParam1);
+
+    *dwParam1 = (strlen(WOutDev[wDevID].device) + 1) * sizeof(WCHAR);
+    return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ * 				wodDevInterface			[internal]
+ */
+static DWORD wodDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
+{
+    int length = strlen(WOutDev[wDevID].device) + 1;
+
+    if (dwParam2 >= length * sizeof(WCHAR)) {
+        MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].device, length,
+            dwParam1, min(length, dwParam2 / sizeof(WCHAR)));
+	return MMSYSERR_NOERROR;
+    }
+    return MMSYSERR_INVALPARAM;
+}
 
 /**************************************************************************
  * 				wodMessage (WINEALSA.@)
@@ -1630,6 +1656,8 @@
     case WODM_SETVOLUME:	return wodSetVolume	(wDevID, dwParam1);
     case WODM_RESTART:		return wodRestart	(wDevID);
     case WODM_RESET:		return wodReset		(wDevID);
+    case DRV_QUERYDEVICEINTERFACESIZE: return wodDevInterfaceSize       (wDevID, (LPDWORD)dwParam1);
+    case DRV_QUERYDEVICEINTERFACE:     return wodDevInterface           (wDevID, (PWCHAR)dwParam1, dwParam2);
     case DRV_QUERYDSOUNDIFACE:	return wodDsCreate	(wDevID, (PIDSDRIVER*)dwParam1);
     case DRV_QUERYDSOUNDDESC:	return wodDsDesc	(wDevID, (PDSDRIVERDESC)dwParam1);
     case DRV_QUERYDSOUNDGUID:	return wodDsGuid	(wDevID, (LPGUID)dwParam1);
