Jörg Höhle : mmsystem: Fix some MCI mappings.
Alexandre Julliard
julliard at winehq.org
Thu May 26 10:56:28 CDT 2011
Module: wine
Branch: master
Commit: bc9b9d53c12829d53b6b4fb3548a209cda19cc76
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc9b9d53c12829d53b6b4fb3548a209cda19cc76
Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date: Fri Apr 15 21:26:32 2011 +0200
mmsystem: Fix some MCI mappings.
---
dlls/mmsystem.dll16/mci16.c | 53 ++++++++++++++++++++----------------------
1 files changed, 25 insertions(+), 28 deletions(-)
diff --git a/dlls/mmsystem.dll16/mci16.c b/dlls/mmsystem.dll16/mci16.c
index 3d9c73f..d39a047 100644
--- a/dlls/mmsystem.dll16/mci16.c
+++ b/dlls/mmsystem.dll16/mci16.c
@@ -206,13 +206,15 @@ static MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* l
mdsp32w->dwTrack = mdsp16->dwTrack;
if (dwFlags & MCI_DGV_STATUS_DISKSPACE)
mdsp32w->lpstrDrive = MCI_strdupAtoW(MapSL(mdsp16->lpstrDrive));
- mdsp32w->dwReference = mdsp16->dwReference;
+ if (dwFlags & MCI_DGV_STATUS_REFERENCE)
+ mdsp32w->dwReference = mdsp16->dwReference;
*lParam = (DWORD)mdsp32w;
} else {
return MMSYSTEM_MAP_NOMEM;
}
} else {
*lParam = (DWORD)MapSL(*lParam);
+ return MMSYSTEM_MAP_OK;
}
}
return MMSYSTEM_MAP_OKMEM;
@@ -263,18 +265,17 @@ static MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* l
return MMSYSTEM_MAP_OKMEM;
case MCI_INFO:
{
- LPMCI_INFO_PARMSW mip32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_INFO_PARMSW));
- LPMCI_INFO_PARMS16 mip16 = MapSL(*lParam);
+ LPMCI_DGV_INFO_PARMSW mip32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_DGV_INFO_PARMS16) + sizeof(MCI_DGV_INFO_PARMSW));
+ LPMCI_DGV_INFO_PARMS16 mip16 = MapSL(*lParam);
- /* FIXME this is wrong if device is of type
- * MCI_DEVTYPE_DIGITAL_VIDEO, some members are not mapped
- */
if (mip32w) {
- *(LPMCI_INFO_PARMS16*)(mip32w) = mip16;
- mip32w = (LPMCI_INFO_PARMSW)((char*)mip32w + sizeof(LPMCI_INFO_PARMS16));
+ *(LPMCI_DGV_INFO_PARMS16*)(mip32w) = mip16;
+ mip32w = (LPMCI_DGV_INFO_PARMSW)((char*)mip32w + sizeof(LPMCI_DGV_INFO_PARMS16));
mip32w->dwCallback = mip16->dwCallback;
mip32w->lpstrReturn = HeapAlloc(GetProcessHeap(), 0, mip16->dwRetSize * sizeof(WCHAR));
- mip32w->dwRetSize = mip16->dwRetSize * sizeof(WCHAR);
+ mip32w->dwRetSize = mip16->dwRetSize;
+ if (dwFlags & MCI_DGV_INFO_ITEM)
+ mip32w->dwItem = mip16->dwItem;
} else {
return MMSYSTEM_MAP_NOMEM;
}
@@ -284,7 +285,7 @@ static MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* l
case MCI_OPEN:
case MCI_OPEN_DRIVER:
{
- LPMCI_OPEN_PARMSW mop32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_OPEN_PARMSW) + 2 * sizeof(DWORD));
+ LPMCI_OPEN_PARMSW mop32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_ANIM_OPEN_PARMSW));
LPMCI_OPEN_PARMS16 mop16 = MapSL(*lParam);
if (mop32w) {
@@ -312,7 +313,8 @@ static MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* l
* to fetch uDevType. When, this is known, the mapping for sending the
* MCI_OPEN_DRIVER shall be done depending on uDevType.
*/
- memcpy(mop32w + 1, mop16 + 1, 2 * sizeof(DWORD));
+ if (HIWORD(dwFlags))
+ memcpy(mop32w + 1, mop16 + 1, sizeof(MCI_ANIM_OPEN_PARMS16) - sizeof(MCI_OPEN_PARMS16));
} else {
return MMSYSTEM_MAP_NOMEM;
}
@@ -383,7 +385,7 @@ static MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* l
/**************************************************************************
* MCI_UnMapMsg16To32W [internal]
*/
-static MMSYSTEM_MapType MCI_UnMapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR lParam)
+static MMSYSTEM_MapType MCI_UnMapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR lParam, DWORD result)
{
switch (wMsg) {
/* case MCI_CAPTURE */
@@ -423,7 +425,6 @@ static MMSYSTEM_MapType MCI_UnMapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR
LPMCI_DGV_RECT_PARMS mdrp32 = (LPMCI_DGV_RECT_PARMS)lParam;
char *base = (char*)lParam - sizeof(LPMCI_DGV_RECT_PARMS16);
LPMCI_DGV_RECT_PARMS16 mdrp16 = *(LPMCI_DGV_RECT_PARMS16*)base;
- mdrp16->dwCallback = mdrp32->dwCallback;
mdrp16->rc.left = mdrp32->rc.left;
mdrp16->rc.top = mdrp32->rc.top;
mdrp16->rc.right = mdrp32->rc.right;
@@ -432,15 +433,11 @@ static MMSYSTEM_MapType MCI_UnMapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR
}
return MMSYSTEM_MAP_OK;
case MCI_STATUS:
- if (lParam && (dwFlags & (MCI_DGV_STATUS_REFERENCE | MCI_DGV_STATUS_DISKSPACE))) {
+ if (lParam) {
LPMCI_DGV_STATUS_PARMSW mdsp32w = (LPMCI_DGV_STATUS_PARMSW)lParam;
char *base = (char*)lParam - sizeof(LPMCI_DGV_STATUS_PARMS16);
LPMCI_DGV_STATUS_PARMS16 mdsp16 = *(LPMCI_DGV_STATUS_PARMS16*)base;
- mdsp16->dwCallback = mdsp32w->dwCallback;
mdsp16->dwReturn = mdsp32w->dwReturn;
- mdsp16->dwItem = mdsp32w->dwItem;
- mdsp16->dwTrack = mdsp32w->dwTrack;
- mdsp16->dwReference = mdsp32w->dwReference;
HeapFree(GetProcessHeap(), 0, (LPVOID)mdsp32w->lpstrDrive);
HeapFree(GetProcessHeap(), 0, base);
}
@@ -469,10 +466,12 @@ static MMSYSTEM_MapType MCI_UnMapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR
char *base = (char*)lParam - sizeof(LPMCI_INFO_PARMS16);
LPMCI_INFO_PARMS16 mip16 = *(LPMCI_INFO_PARMS16*)base;
- WideCharToMultiByte(CP_ACP, 0,
- mip32w->lpstrReturn, mip32w->dwRetSize / sizeof(WCHAR),
- MapSL(mip16->lpstrReturn), mip16->dwRetSize,
- NULL, NULL);
+ if (result == MMSYSERR_NOERROR)
+ WideCharToMultiByte(CP_ACP, 0,
+ mip32w->lpstrReturn, mip32w->dwRetSize,
+ MapSL(mip16->lpstrReturn), mip16->dwRetSize,
+ NULL, NULL);
+ mip16->dwRetSize = mip32w->dwRetSize; /* never update prior to NT? */
HeapFree(GetProcessHeap(), 0, mip32w->lpstrReturn);
HeapFree(GetProcessHeap(), 0, base);
}
@@ -488,7 +487,7 @@ static MMSYSTEM_MapType MCI_UnMapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR
*quantity = *(DWORD *)msip32w->lpstrReturn;
}
- else {
+ else if (result == MMSYSERR_NOERROR) {
WideCharToMultiByte(CP_ACP, 0,
msip32w->lpstrReturn, msip32w->dwRetSize,
MapSL(msip16->lpstrReturn), msip16->dwRetSize,
@@ -520,8 +519,7 @@ static MMSYSTEM_MapType MCI_UnMapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR
HeapFree(GetProcessHeap(), 0, (LPWSTR)mop32w->lpstrElementName);
if( ( dwFlags & MCI_OPEN_ALIAS))
HeapFree(GetProcessHeap(), 0, (LPWSTR)mop32w->lpstrAlias);
- if (!HeapFree(GetProcessHeap(), 0, base))
- FIXME("bad free line=%d\n", __LINE__);
+ HeapFree(GetProcessHeap(), 0, base);
}
return MMSYSTEM_MAP_OK;
case DRV_LOAD:
@@ -750,18 +748,17 @@ DWORD WINAPI mciSendCommand16(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD
switch (res = MCI_MapMsg16To32W(wMsg, dwParam1, &dwParam2)) {
case MMSYSTEM_MAP_MSGERROR:
- TRACE("%s not handled yet\n", MCI_MessageToString(wMsg));
dwRet = MCIERR_DRIVER_INTERNAL;
break;
case MMSYSTEM_MAP_NOMEM:
- TRACE("Problem mapping %s from 16 to 32a\n", MCI_MessageToString(wMsg));
+ TRACE("Problem mapping %s from 16 to 32\n", MCI_MessageToString(wMsg));
dwRet = MCIERR_OUT_OF_MEMORY;
break;
case MMSYSTEM_MAP_OK:
case MMSYSTEM_MAP_OKMEM:
dwRet = mciSendCommandW(wDevID, wMsg, dwParam1, dwParam2);
if (res == MMSYSTEM_MAP_OKMEM)
- MCI_UnMapMsg16To32W(wMsg, dwParam1, dwParam2);
+ MCI_UnMapMsg16To32W(wMsg, dwParam1, dwParam2, dwRet);
break;
}
}
More information about the wine-cvs
mailing list