diff --git a/if1632/user.spec b/if1632/user.spec
index e3bc89b1cfb28795e7cefcd76326a80f9d2db567..b9d9b7899e5e103049e3ee3f97a211504d6477f8 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -259,7 +259,7 @@ file	user.exe
 252 pascal16 OpenDriver(str str long) OpenDriver16
 253 pascal   CloseDriver(word long long) CloseDriver16
 254 pascal16 GetDriverModuleHandle(word) GetDriverModuleHandle16
-255 pascal   DefDriverProc(long word word long long) DefDriverProc
+255 pascal   DefDriverProc(long word word long long) DefDriverProc16
 256 pascal16 GetDriverInfo(word ptr) GetDriverInfo
 257 pascal16 GetNextDriver(word long) GetNextDriver
 258 pascal16 MapWindowPoints(word word ptr word) MapWindowPoints16
diff --git a/include/driver.h b/include/driver.h
index f40c29c0462d6037e2526164e9ca44628cb86254..a0f214ae84c6d8a19cb176d22d96aa8ad1e340ff 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -79,8 +79,11 @@ typedef struct tagDRIVERITEM32A {
 	DRIVERPROC32		driverproc;
 } DRIVERITEM32A,*LPDRIVERITEM32A;
 
-LRESULT WINAPI DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
-                             LPARAM dwParam1, LPARAM dwParam2);
+LRESULT WINAPI DefDriverProc16(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
+                               LPARAM dwParam1, LPARAM dwParam2);
+LRESULT WINAPI DefDriverProc32(DWORD dwDriverIdentifier, HDRVR32 hdrvr,
+                               UINT32 Msg, LPARAM lParam1, LPARAM lParam2);
+#define DefDriverProc WINELIB_NAME(DefDriverProc)
 HDRVR16 WINAPI OpenDriver16(LPCSTR szDriverName, LPCSTR szSectionName,
                             LPARAM lParam2);
 HDRVR32 WINAPI OpenDriver32A(LPCSTR szDriverName, LPCSTR szSectionName,
diff --git a/multimedia/audio.c b/multimedia/audio.c
index bade5c73684bdb3c5575d3f3791158b9bdb10bac..64cf6aee4f6ff4e479b9f86c1de40cf2880646ec 100644
--- a/multimedia/audio.c
+++ b/multimedia/audio.c
@@ -1760,7 +1760,7 @@ LONG WAVE_DriverProc16(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
     case MCI_PASTE:		return MMSYSERR_NOTSUPPORTED;
 	
     default:
-	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+	return DefDriverProc16(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     }
     return MMSYSERR_NOTENABLED;
 }
@@ -1817,7 +1817,7 @@ LONG WAVE_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
 	
     default:
 	FIXME(mciwave, "is probably wrong\n");
-	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+	return DefDriverProc32(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     }
     return MMSYSERR_NOTENABLED;
 }
diff --git a/multimedia/mcianim.c b/multimedia/mcianim.c
index 76dff47b00384950429acd72971740d73cee2c77..a12af8ef0e576c4f6a5ec1435beb1047b8df9936 100644
--- a/multimedia/mcianim.c
+++ b/multimedia/mcianim.c
@@ -570,7 +570,7 @@ LONG ANIM_DriverProc16(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
     case MCI_PAUSE:		return ANIM_mciPause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
     case MCI_RESUME:		return ANIM_mciResume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
     case MCI_SEEK:		return ANIM_mciSeek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)PTR_SEG_TO_LIN(dwParam2));
-    default:			return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+    default:			return DefDriverProc16(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     }
 }
 /**************************************************************************
@@ -603,7 +603,7 @@ LONG ANIM_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
     case MCI_PAUSE:		return ANIM_mciPause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
     case MCI_RESUME:		return ANIM_mciResume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
     case MCI_SEEK:		return ANIM_mciSeek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)dwParam2);
-    default:			return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+    default:			return DefDriverProc32(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     }
 }
 
diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c
index 9d02747baeb41a4cf2e92a7856851ead8fe1472a..5ddc6bac469f1e7ae74f5977f3ffcde643adbedc 100644
--- a/multimedia/mcicda.c
+++ b/multimedia/mcicda.c
@@ -1075,7 +1075,7 @@ LONG CDAUDIO_DriverProc16(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 	CDADev[dwDevID].nTracks = 0;
 	return 0;
     default:
-	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+	return DefDriverProc16(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     }
 #else
     return MCIERR_HARDWARE;
@@ -1133,7 +1133,7 @@ LONG CDAUDIO_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
 	CDADev[dwDevID].nTracks = 0;
 	return 0;
     default:
-	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+	return DefDriverProc32(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     }
 #else
     return MCIERR_HARDWARE;
diff --git a/multimedia/midi.c b/multimedia/midi.c
index c0e969a3e08455b6df6b737e49b4ff88b02f8d0d..1ecd34711d3f655643203668fbfa49e301dc7245 100644
--- a/multimedia/midi.c
+++ b/multimedia/midi.c
@@ -2662,7 +2662,7 @@ LONG MIDI_DriverProc16(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
     case MCI_STATUS:		return MIDI_mciStatus(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)PTR_SEG_TO_LIN(dwParam2));
     case MCI_GETDEVCAPS:	return MIDI_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)PTR_SEG_TO_LIN(dwParam2));
     case MCI_INFO:		return MIDI_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMS16)PTR_SEG_TO_LIN(dwParam2));
-    default:			return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+    default:			return DefDriverProc16(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     }
 }
 
@@ -2696,7 +2696,7 @@ LONG MIDI_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
     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_PARMS16)dwParam2);
-    default:			return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+    default:			return DefDriverProc32(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
     }
 }
 /*-----------------------------------------------------------------------*/
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 236c5e8694025f21ddc7fe145e1ebc4a3d158d16..bf1e4f178059d60f346dfc146b24a6b26ef88f33 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -4262,7 +4262,27 @@ HANDLE16 WINAPI DrvGetModuleHandle16(HDRVR16 hDrvr)
 LRESULT WINAPI DrvDefDriverProc(DWORD dwDriverID, HDRVR16 hDriv, WORD wMsg, 
                                 DWORD dwParam1, DWORD dwParam2)
 {
-    return DefDriverProc(dwDriverID, hDriv, wMsg, dwParam1, dwParam2);
+    return DefDriverProc16(dwDriverID, hDriv, wMsg, dwParam1, dwParam2);
+}
+
+/**************************************************************************
+ * 				DefDriverProc32  [WINMM.5]
+ */
+LRESULT WINAPI DefDriverProc32(DWORD dwDriverIdentifier, HDRVR32 hdrvr,
+                               UINT32 Msg, LPARAM lParam1, LPARAM lParam2)
+{
+    switch (Msg) {
+      case DRV_LOAD:
+      case DRV_DISABLE:
+      case DRV_INSTALL:
+        return 0;
+      case DRV_ENABLE:
+      case DRV_FREE:
+      case DRV_REMOVE:
+        return 1;
+      default:
+        return 0;
+    }
 }
 
 /**************************************************************************
diff --git a/relay32/winmm.spec b/relay32/winmm.spec
index 08d30e998976d3ca5325615623b5b60a9f0e18d2..35c7f8ce70700b5e00b72d68f2be14376a9a604c 100644
--- a/relay32/winmm.spec
+++ b/relay32/winmm.spec
@@ -5,7 +5,7 @@ type win32
   2 stdcall WINMM_2(ptr long long) PlaySound32A
   3 stub WINMM_3
   4 stub CloseDriver
-  5 stdcall DefDriverProc(long long long long long) DefDriverProc
+  5 stdcall DefDriverProc(long long long long long) DefDriverProc32
   6 stub DriverCallback
   7 stub DrvClose
   8 stub DrvDefDriverProc
diff --git a/windows/driver.c b/windows/driver.c
index e38fecfa17b512ca2bf87503e73582b0c3c0b15c..4ec9c3de92b5c2c2d07c4932e212695d249e421c 100644
--- a/windows/driver.c
+++ b/windows/driver.c
@@ -335,10 +335,10 @@ HMODULE32 WINAPI GetDriverModuleHandle32(HDRVR32 hDrvr)
 }
 
 /**************************************************************************
- *				DefDriverProc			[USER.255]
+ *				DefDriverProc16			[USER.255]
  */
-LRESULT WINAPI DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
-                             LPARAM lParam1, LPARAM lParam2)
+LRESULT WINAPI DefDriverProc16(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
+                               LPARAM lParam1, LPARAM lParam2)
 {
     switch(wMsg)
     {