diff --git a/dlls/winmm/lolvldrv.c b/dlls/winmm/lolvldrv.c index 348090e0c03..a78982f4b48 100644 --- a/dlls/winmm/lolvldrv.c +++ b/dlls/winmm/lolvldrv.c @@ -461,7 +461,7 @@ LPWINE_MLD MMDRV_GetRelated(HANDLE hndl, UINT srcType, * MMDRV_PhysicalFeatures [internal] */ UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, - DWORD dwParam2) + DWORD dwParam2, BOOL bFrom32) { WINE_MM_DRIVER* lpDrv = &MMDrvs[mld->mmdIndex]; @@ -470,10 +470,16 @@ UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, /* all those function calls are undocumented */ switch (uMsg) { case DRV_QUERYDRVENTRY: - lstrcpynA((LPSTR)dwParam1, lpDrv->drvname, LOWORD(dwParam2)); + if (bFrom32) + lstrcpynA((LPSTR)dwParam1, lpDrv->drvname, LOWORD(dwParam2)); + else + lstrcpynA((LPSTR)MapSL(dwParam1), lpDrv->drvname, LOWORD(dwParam2)); break; case DRV_QUERYDEVNODE: - *(LPDWORD)dwParam1 = 0L; /* should be DevNode */ + if (bFrom32) + *(LPDWORD)dwParam1 = 0L; /* should be DevNode */ + else + *(DWORD*)MapSL(dwParam1) = 0L; break; case DRV_QUERYNAME: WARN("NIY QueryName\n"); @@ -489,11 +495,7 @@ UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, return (lpDrv->bIsMapper) ? 2 : 0; case DRV_QUERYDSOUNDIFACE: /* Wine-specific: Retrieve DirectSound interface */ - return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); - case DRV_QUERYDSOUNDDESC: /* Wine-specific: Retrieve DirectSound driver description*/ - return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); - case DRV_QUERYDSOUNDGUID: /* Wine-specific: Retrieve DirectSound driver GUID */ return MMDRV_Message(mld, uMsg, dwParam1, dwParam2, TRUE); diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c index d9e60ea5401..56e14025fad 100644 --- a/dlls/winmm/mmsystem.c +++ b/dlls/winmm/mmsystem.c @@ -1465,7 +1465,7 @@ DWORD WINAPI waveOutMessage16(HWAVEOUT16 hWaveOut, UINT16 uMessage, 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); + return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2, FALSE); } return MMSYSERR_INVALHANDLE; } @@ -1703,14 +1703,18 @@ DWORD WINAPI waveInMessage16(HWAVEIN16 hWaveIn, UINT16 uMessage, TRACE("(%04x, %u, %ld, %ld)\n", hWaveIn, uMessage, dwParam1, dwParam2); + 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 MMSYSERR_INVALHANDLE; + } + /* from M$ KB */ if (uMessage < DRVM_IOCTL || (uMessage >= DRVM_IOCTL_LAST && uMessage < DRVM_MAPPER)) return MMSYSERR_INVALPARAM; - if ((wmld = MMDRV_Get(HWAVEIN_32(hWaveIn), MMDRV_WAVEIN, FALSE)) == NULL) - return MMSYSERR_INVALHANDLE; - - return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE); + return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, FALSE); } /* ################################################### diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h index 95665024e07..e3cbba4353a 100644 --- a/dlls/winmm/winemm.h +++ b/dlls/winmm/winemm.h @@ -247,7 +247,7 @@ DWORD MMDRV_Close(LPWINE_MLD mld, UINT wMsg); LPWINE_MLD MMDRV_Get(HANDLE hndl, UINT type, BOOL bCanBeID); 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); +UINT MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32); BOOL MMDRV_Is32(unsigned int); void MMDRV_InstallMap(unsigned int, MMDRV_MAPFUNC, MMDRV_UNMAPFUNC, MMDRV_MAPFUNC, MMDRV_UNMAPFUNC, LPDRVCALLBACK); diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c index ad4cf277005..026904c51c9 100644 --- a/dlls/winmm/winmm.c +++ b/dlls/winmm/winmm.c @@ -1292,7 +1292,7 @@ UINT WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, return 0; } if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, TRUE)) != NULL) { - return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2); + return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2, TRUE); } return MMSYSERR_INVALHANDLE; } @@ -2605,7 +2605,7 @@ UINT WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, 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); + return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2, TRUE); } return MMSYSERR_INVALHANDLE; } @@ -2860,7 +2860,7 @@ UINT WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, 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); + return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2, TRUE); } return MMSYSERR_INVALHANDLE; }