Index: lolvldrv.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/lolvldrv.c,v
retrieving revision 1.53
diff -u -r1.53 lolvldrv.c
--- lolvldrv.c	9 Nov 2003 01:19:58 -0000	1.53
+++ lolvldrv.c	30 Nov 2003 13:24:25 -0000
@@ -160,6 +160,14 @@
 }
 
 /**************************************************************************
+ * 				MMDRV_GetDriver			[internal]
+ */
+WINE_MM_DRIVER*	MMDRV_GetDriver(LPWINE_MLD mld)
+{
+  return &MMDrvs[mld->mmdIndex];
+}
+
+/**************************************************************************
  * 			MMDRV_GetNum				[internal]
  */
 UINT	MMDRV_GetNum(UINT type)
@@ -469,18 +477,6 @@
 
     /* all those function calls are undocumented */
     switch (uMsg) {
-    case DRV_QUERYDRVENTRY:
-	if (bFrom32)
-	    lstrcpynA((LPSTR)dwParam1, lpDrv->drvname, LOWORD(dwParam2));
-	else
-	    lstrcpynA((LPSTR)MapSL(dwParam1), lpDrv->drvname, LOWORD(dwParam2));
-	break;
-    case DRV_QUERYDEVNODE:
-	if (bFrom32)
-	    *(LPDWORD)dwParam1 = 0L; /* should be DevNode */
-	else
-	    *(DWORD*)MapSL(dwParam1) = 0L;
-	break;
     case DRV_QUERYNAME:
 	WARN("NIY QueryName\n");
 	break;
Index: mmsystem.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/mmsystem.c,v
retrieving revision 1.101
diff -u -r1.101 mmsystem.c
--- mmsystem.c	9 Nov 2003 01:19:58 -0000	1.101
+++ mmsystem.c	30 Nov 2003 13:24:27 -0000
@@ -115,6 +115,30 @@
     return TRUE;
 }
 
+/**************************************************************************
+ * 				MMDRV_PhysicalFeatures16	[internal]
+ */
+UINT	MMDRV_PhysicalFeatures16(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1,
+			       DWORD dwParam2)
+{
+    WINE_MM_DRIVER*	lpDrv = MMDRV_GetDriver(mld);
+
+    TRACE("(%p, %04x, %08lx, %08lx)\n", mld, uMsg, dwParam1, dwParam2);
+
+    /* all those function calls are undocumented */
+    switch (uMsg) {
+    case DRV_QUERYDRVENTRY:
+	lstrcpynA((LPSTR)MapSL(dwParam1), lpDrv->drvname, LOWORD(dwParam2));
+	break;
+    case DRV_QUERYDEVNODE:
+        *(DWORD*)MapSL(dwParam1) = 0L;
+        break;
+    default:
+	return MMDRV_PhysicalFeatures(mld, uMsg, dwParam1, dwParam2, FALSE);
+    }
+    return 0L;
+}
+
 /* ###################################################
  * #                  PlaySound                      #
  * ###################################################
@@ -1485,7 +1509,7 @@
 
     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, FALSE);
+	    return MMDRV_PhysicalFeatures16(wmld, uMessage, dwParam1, dwParam2);
 	}
 	return MMSYSERR_INVALHANDLE;
     }
@@ -1726,7 +1750,7 @@
 
     if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL) {
 	if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, TRUE)) != NULL) {
-	    return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2, FALSE);
+	    return MMDRV_PhysicalFeatures16(wmld, uMessage, dwParam1, dwParam2);
 	}
 	return MMSYSERR_INVALHANDLE;
     }
Index: winemm.h
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winemm.h,v
retrieving revision 1.48
diff -u -r1.48 winemm.h
--- winemm.h	9 Nov 2003 01:19:58 -0000	1.48
+++ winemm.h	30 Nov 2003 13:24:27 -0000
@@ -234,6 +234,7 @@
 
 BOOL		MMDRV_Init(void);
 void            MMDRV_Exit(void);
+WINE_MM_DRIVER*	MMDRV_GetDriver(LPWINE_MLD);
 UINT		MMDRV_GetNum(UINT);
 LPWINE_MLD	MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags,
                             DWORD* dwCallback, DWORD* dwInstance, BOOL bFrom32);
@@ -244,6 +245,8 @@
 LPWINE_MLD	MMDRV_GetRelated(HANDLE hndl, UINT srcType, BOOL bSrcCanBeID, UINT dstTyped);
 DWORD		MMDRV_Message(LPWINE_MLD mld, WORD wMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32);
 UINT		MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32);
+UINT		MMDRV_PhysicalFeatures16(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
+UINT		MMDRV_PhysicalFeatures32(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
 BOOL            MMDRV_Is32(unsigned int);
 void            MMDRV_InstallMap(unsigned int, MMDRV_MAPFUNC, MMDRV_UNMAPFUNC,
                                  MMDRV_MAPFUNC, MMDRV_UNMAPFUNC, LPDRVCALLBACK);
Index: winmm.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winmm.c,v
retrieving revision 1.25
diff -u -r1.25 winmm.c
--- winmm.c	26 Nov 2003 03:39:13 -0000	1.25
+++ winmm.c	30 Nov 2003 13:24:29 -0000
@@ -167,6 +167,30 @@
 }
 
 /**************************************************************************
+ * 				MMDRV_PhysicalFeatures32	[internal]
+ */
+UINT	MMDRV_PhysicalFeatures32(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1,
+			       DWORD dwParam2)
+{
+    WINE_MM_DRIVER*	lpDrv = MMDRV_GetDriver(mld);
+
+    TRACE("(%p, %04x, %08lx, %08lx)\n", mld, uMsg, dwParam1, dwParam2);
+
+    /* all those function calls are undocumented */
+    switch (uMsg) {
+    case DRV_QUERYDRVENTRY:
+        lstrcpynA((LPSTR)dwParam1, lpDrv->drvname, LOWORD(dwParam2));
+	break;
+    case DRV_QUERYDEVNODE:
+	*(LPDWORD)dwParam1 = 0L; /* should be DevNode */
+	break;
+    default:
+	return MMDRV_PhysicalFeatures(mld, uMsg, dwParam1, dwParam2, TRUE);
+    }
+    return 0L;
+}
+
+/**************************************************************************
  * 	Mixer devices. New to Win95
  */
 
@@ -1306,7 +1330,7 @@
 	    return 0;
 	}
 	if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, TRUE)) != NULL) {
-	    return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2, TRUE);
+	    return MMDRV_PhysicalFeatures32(wmld, uMessage, dwParam1, dwParam2);
 	}
 	return MMSYSERR_INVALHANDLE;
     }
@@ -2619,7 +2643,7 @@
 
     if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, FALSE)) == NULL) {
 	if ((wmld = MMDRV_Get(hWaveOut, MMDRV_WAVEOUT, TRUE)) != NULL) {
-	    return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2, TRUE);
+	    return MMDRV_PhysicalFeatures32(wmld, uMessage, dwParam1, dwParam2);
 	}
 	return MMSYSERR_INVALHANDLE;
     }
@@ -2877,7 +2901,7 @@
 
     if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, FALSE)) == NULL) {
 	if ((wmld = MMDRV_Get(hWaveIn, MMDRV_WAVEIN, TRUE)) != NULL) {
-	    return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2, TRUE);
+	    return MMDRV_PhysicalFeatures32(wmld, uMessage, dwParam1, dwParam2);
 	}
 	return MMSYSERR_INVALHANDLE;
     }
