mmsystem: Fix some MCI mappings.

This commit is contained in:
Jörg Höhle 2011-04-15 21:26:32 +02:00 committed by Alexandre Julliard
parent f8679cfa2f
commit bc9b9d53c1
1 changed files with 25 additions and 28 deletions

View File

@ -206,13 +206,15 @@ static MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* l
mdsp32w->dwTrack = mdsp16->dwTrack; mdsp32w->dwTrack = mdsp16->dwTrack;
if (dwFlags & MCI_DGV_STATUS_DISKSPACE) if (dwFlags & MCI_DGV_STATUS_DISKSPACE)
mdsp32w->lpstrDrive = MCI_strdupAtoW(MapSL(mdsp16->lpstrDrive)); mdsp32w->lpstrDrive = MCI_strdupAtoW(MapSL(mdsp16->lpstrDrive));
mdsp32w->dwReference = mdsp16->dwReference; if (dwFlags & MCI_DGV_STATUS_REFERENCE)
mdsp32w->dwReference = mdsp16->dwReference;
*lParam = (DWORD)mdsp32w; *lParam = (DWORD)mdsp32w;
} else { } else {
return MMSYSTEM_MAP_NOMEM; return MMSYSTEM_MAP_NOMEM;
} }
} else { } else {
*lParam = (DWORD)MapSL(*lParam); *lParam = (DWORD)MapSL(*lParam);
return MMSYSTEM_MAP_OK;
} }
} }
return MMSYSTEM_MAP_OKMEM; return MMSYSTEM_MAP_OKMEM;
@ -263,18 +265,17 @@ static MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* l
return MMSYSTEM_MAP_OKMEM; return MMSYSTEM_MAP_OKMEM;
case MCI_INFO: case MCI_INFO:
{ {
LPMCI_INFO_PARMSW mip32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_INFO_PARMSW)); LPMCI_DGV_INFO_PARMSW mip32w = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_DGV_INFO_PARMS16) + sizeof(MCI_DGV_INFO_PARMSW));
LPMCI_INFO_PARMS16 mip16 = MapSL(*lParam); 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) { if (mip32w) {
*(LPMCI_INFO_PARMS16*)(mip32w) = mip16; *(LPMCI_DGV_INFO_PARMS16*)(mip32w) = mip16;
mip32w = (LPMCI_INFO_PARMSW)((char*)mip32w + sizeof(LPMCI_INFO_PARMS16)); mip32w = (LPMCI_DGV_INFO_PARMSW)((char*)mip32w + sizeof(LPMCI_DGV_INFO_PARMS16));
mip32w->dwCallback = mip16->dwCallback; mip32w->dwCallback = mip16->dwCallback;
mip32w->lpstrReturn = HeapAlloc(GetProcessHeap(), 0, mip16->dwRetSize * sizeof(WCHAR)); 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 { } else {
return MMSYSTEM_MAP_NOMEM; 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:
case MCI_OPEN_DRIVER: 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); LPMCI_OPEN_PARMS16 mop16 = MapSL(*lParam);
if (mop32w) { 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 * to fetch uDevType. When, this is known, the mapping for sending the
* MCI_OPEN_DRIVER shall be done depending on uDevType. * 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 { } else {
return MMSYSTEM_MAP_NOMEM; return MMSYSTEM_MAP_NOMEM;
} }
@ -383,7 +385,7 @@ static MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* l
/************************************************************************** /**************************************************************************
* MCI_UnMapMsg16To32W [internal] * 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) { switch (wMsg) {
/* case MCI_CAPTURE */ /* 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; LPMCI_DGV_RECT_PARMS mdrp32 = (LPMCI_DGV_RECT_PARMS)lParam;
char *base = (char*)lParam - sizeof(LPMCI_DGV_RECT_PARMS16); char *base = (char*)lParam - sizeof(LPMCI_DGV_RECT_PARMS16);
LPMCI_DGV_RECT_PARMS16 mdrp16 = *(LPMCI_DGV_RECT_PARMS16*)base; LPMCI_DGV_RECT_PARMS16 mdrp16 = *(LPMCI_DGV_RECT_PARMS16*)base;
mdrp16->dwCallback = mdrp32->dwCallback;
mdrp16->rc.left = mdrp32->rc.left; mdrp16->rc.left = mdrp32->rc.left;
mdrp16->rc.top = mdrp32->rc.top; mdrp16->rc.top = mdrp32->rc.top;
mdrp16->rc.right = mdrp32->rc.right; 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; return MMSYSTEM_MAP_OK;
case MCI_STATUS: 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; LPMCI_DGV_STATUS_PARMSW mdsp32w = (LPMCI_DGV_STATUS_PARMSW)lParam;
char *base = (char*)lParam - sizeof(LPMCI_DGV_STATUS_PARMS16); char *base = (char*)lParam - sizeof(LPMCI_DGV_STATUS_PARMS16);
LPMCI_DGV_STATUS_PARMS16 mdsp16 = *(LPMCI_DGV_STATUS_PARMS16*)base; LPMCI_DGV_STATUS_PARMS16 mdsp16 = *(LPMCI_DGV_STATUS_PARMS16*)base;
mdsp16->dwCallback = mdsp32w->dwCallback;
mdsp16->dwReturn = mdsp32w->dwReturn; 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, (LPVOID)mdsp32w->lpstrDrive);
HeapFree(GetProcessHeap(), 0, base); 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); char *base = (char*)lParam - sizeof(LPMCI_INFO_PARMS16);
LPMCI_INFO_PARMS16 mip16 = *(LPMCI_INFO_PARMS16*)base; LPMCI_INFO_PARMS16 mip16 = *(LPMCI_INFO_PARMS16*)base;
WideCharToMultiByte(CP_ACP, 0, if (result == MMSYSERR_NOERROR)
mip32w->lpstrReturn, mip32w->dwRetSize / sizeof(WCHAR), WideCharToMultiByte(CP_ACP, 0,
MapSL(mip16->lpstrReturn), mip16->dwRetSize, mip32w->lpstrReturn, mip32w->dwRetSize,
NULL, NULL); MapSL(mip16->lpstrReturn), mip16->dwRetSize,
NULL, NULL);
mip16->dwRetSize = mip32w->dwRetSize; /* never update prior to NT? */
HeapFree(GetProcessHeap(), 0, mip32w->lpstrReturn); HeapFree(GetProcessHeap(), 0, mip32w->lpstrReturn);
HeapFree(GetProcessHeap(), 0, base); HeapFree(GetProcessHeap(), 0, base);
} }
@ -488,7 +487,7 @@ static MMSYSTEM_MapType MCI_UnMapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR
*quantity = *(DWORD *)msip32w->lpstrReturn; *quantity = *(DWORD *)msip32w->lpstrReturn;
} }
else { else if (result == MMSYSERR_NOERROR) {
WideCharToMultiByte(CP_ACP, 0, WideCharToMultiByte(CP_ACP, 0,
msip32w->lpstrReturn, msip32w->dwRetSize, msip32w->lpstrReturn, msip32w->dwRetSize,
MapSL(msip16->lpstrReturn), msip16->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); HeapFree(GetProcessHeap(), 0, (LPWSTR)mop32w->lpstrElementName);
if( ( dwFlags & MCI_OPEN_ALIAS)) if( ( dwFlags & MCI_OPEN_ALIAS))
HeapFree(GetProcessHeap(), 0, (LPWSTR)mop32w->lpstrAlias); HeapFree(GetProcessHeap(), 0, (LPWSTR)mop32w->lpstrAlias);
if (!HeapFree(GetProcessHeap(), 0, base)) HeapFree(GetProcessHeap(), 0, base);
FIXME("bad free line=%d\n", __LINE__);
} }
return MMSYSTEM_MAP_OK; return MMSYSTEM_MAP_OK;
case DRV_LOAD: case DRV_LOAD:
@ -750,18 +748,17 @@ DWORD WINAPI mciSendCommand16(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD
switch (res = MCI_MapMsg16To32W(wMsg, dwParam1, &dwParam2)) { switch (res = MCI_MapMsg16To32W(wMsg, dwParam1, &dwParam2)) {
case MMSYSTEM_MAP_MSGERROR: case MMSYSTEM_MAP_MSGERROR:
TRACE("%s not handled yet\n", MCI_MessageToString(wMsg));
dwRet = MCIERR_DRIVER_INTERNAL; dwRet = MCIERR_DRIVER_INTERNAL;
break; break;
case MMSYSTEM_MAP_NOMEM: 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; dwRet = MCIERR_OUT_OF_MEMORY;
break; break;
case MMSYSTEM_MAP_OK: case MMSYSTEM_MAP_OK:
case MMSYSTEM_MAP_OKMEM: case MMSYSTEM_MAP_OKMEM:
dwRet = mciSendCommandW(wDevID, wMsg, dwParam1, dwParam2); dwRet = mciSendCommandW(wDevID, wMsg, dwParam1, dwParam2);
if (res == MMSYSTEM_MAP_OKMEM) if (res == MMSYSTEM_MAP_OKMEM)
MCI_UnMapMsg16To32W(wMsg, dwParam1, dwParam2); MCI_UnMapMsg16To32W(wMsg, dwParam1, dwParam2, dwRet);
break; break;
} }
} }