diff -u wine.cvs/dlls/winmm/mmsystem.c wine/dlls/winmm/mmsystem.c
--- wine.cvs/dlls/winmm/mmsystem.c	2003-10-07 21:42:51.000000000 -0400
+++ wine/dlls/winmm/mmsystem.c	2003-10-16 20:57:51.000000000 -0400
@@ -1463,7 +1475,14 @@
 
     if ((wmld = MMDRV_Get(HWAVEOUT_32(hWaveOut), MMDRV_WAVEOUT, FALSE)) == NULL) {
 	if ((wmld = MMDRV_Get(HWAVEOUT_32(hWaveOut), MMDRV_WAVEOUT, TRUE)) != NULL) {
-	    return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2);
+	    switch (uMessage) {
+	    case DRV_QUERYDRVENTRY:	/* first parameter is a pointer */
+	    case DRV_QUERYDEVNODE:
+	    case DRVM_MAPPER_PREFERRED_GET:
+		return MMDRV_PhysicalFeatures(wmld, uMessage, (DWORD)(MapSL(dwParam1)), dwParam2);
+	    default:
+		return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2);
+	    }
 	}
 	return MMSYSERR_INVALHANDLE;
     }
@@ -1700,13 +1730,24 @@
     TRACE("(%04x, %u, %ld, %ld)\n", hWaveIn, uMessage, dwParam1, dwParam2);
 
     /* from M$ KB */
-    if (uMessage < DRVM_IOCTL || (uMessage >= DRVM_IOCTL_LAST && uMessage < DRVM_MAPPER))
+    if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL) {
+	if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, TRUE)) != NULL) {
+	    switch (uMessage) {
+	    case DRV_QUERYDRVENTRY:	/* first parameter is a pointer */
+	    case DRV_QUERYDEVNODE:
+	    case DRVM_MAPPER_PREFERRED_GET:
+		return MMDRV_PhysicalFeatures(wmld, uMessage, (DWORD)(MapSL(dwParam1)), dwParam2);
+	    default:
+		return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2);
+	    }
+	}
 	return MMSYSERR_INVALPARAM;
+    }
 
-    if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL)
-	return MMSYSERR_INVALHANDLE;
+    if (uMessage < DRVM_IOCTL || (uMessage >= DRVM_IOCTL_LAST && uMessage < DRVM_MAPPER))
+	return MMSYSERR_INVALPARAM;
 
-    return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE);
+    return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, FALSE);
 }
 
 /* ###################################################
