Module: wine Branch: master Commit: a9f9b34e17149f110d048e9f9cb7cbc9fc79bf81 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a9f9b34e17149f110d048e9f9c...
Author: Jörg Höhle hoehle@users.sourceforge.net Date: Wed Sep 22 21:17:32 2010 +0200
winmm: MCI_SYSINFO doesn't change the output buffer in case of error.
---
dlls/winmm/mci.c | 2 -- dlls/winmm/tests/mci.c | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c index 455a733..3558d2b 100644 --- a/dlls/winmm/mci.c +++ b/dlls/winmm/mci.c @@ -1843,7 +1843,6 @@ static DWORD MCI_WriteString(LPWSTR lpDstStr, DWORD dstSize, LPCWSTR lpSrcStr)
if (lpSrcStr) { if (dstSize <= strlenW(lpSrcStr)) { - lstrcpynW(lpDstStr, lpSrcStr, dstSize - 1); ret = MCIERR_PARAM_OVERFLOW; } else { strcpyW(lpDstStr, lpSrcStr); @@ -1931,7 +1930,6 @@ static DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSW lpParm ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, wmd->lpstrDeviceType); } else { - *lpParms->lpstrReturn = 0; ret = (uDevID == MCI_ALL_DEVICE_ID) ? MCIERR_CANNOT_USE_ALL : MCIERR_INVALID_DEVICE_NAME; } diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index ebd393f..1672433 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -162,6 +162,13 @@ static void test_notification_dbg(HWND hwnd, const char* command, WPARAM type, i else ok_(__FILE__,line)(msg.wParam == type, "got %04lx instead of MCI_NOTIFY_xyz %04lx from command %s\n", msg.wParam, type, command); }
+static int strcmp_wa(LPCWSTR strw, const char *stra) +{ + CHAR buf[512]; + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0); + return lstrcmpA(buf, stra); +} + static void test_mciParser(HWND hwnd) { MCIERROR err; @@ -385,6 +392,9 @@ static void test_openCloseWAVE(HWND hwnd) ok(!err,"mci close shareable returned %s\n", dbg_mcierr(err)); }
+ err = mciGetDeviceID("waveaudio"); + ok(err==0,"mciGetDeviceID waveaudio returned %u, expected 0\n", err); + err = mciSendString(command_open, buf, sizeof(buf), hwnd); ok(!err,"mci %s returned %s\n", command_open, dbg_mcierr(err)); ok(!strcmp(buf,"1"), "mci open deviceId: %s, expected 1\n", buf); @@ -427,24 +437,27 @@ static void test_openCloseWAVE(HWND hwnd) /* MCI_..._PARMSA and PARMSW share the same layout, use one for both tests. */ err = mciSendCommandW(MCI_ALL_DEVICE_ID, MCI_SYSINFO, MCI_SYSINFO_NAME | MCI_SYSINFO_OPEN, (DWORD_PTR)&parm); ok(!err || broken(err==MMSYSERR_NOTSUPPORTED/* Win9x */), "mciCommandW MCI_SYSINFO all name 1 open buffer[8]: %s\n", dbg_mcierr(err)); - /* TODO strcmpW((LPWSTR)buf,"mysound") */ + if(!err) ok(!strcmp_wa((LPWSTR)buf,"mysound"), "sysinfo name 1 open contents\n");
+ buf[0] = 'Y'; parm.sys.dwNumber = 1; parm.sys.wDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO; /* ignored */ parm.sys.lpstrReturn = buf; parm.sys.dwRetSize = 7; /* too short for mysound\0 */ err = mciSendCommandW(MCI_ALL_DEVICE_ID, MCI_SYSINFO, MCI_SYSINFO_NAME | MCI_SYSINFO_OPEN, (DWORD_PTR)&parm); ok(err==MCIERR_PARAM_OVERFLOW || broken(err==MMSYSERR_NOTSUPPORTED/* Win9x */), "mciCommandW MCI_SYSINFO all name 1 open too small: %s\n", dbg_mcierr(err)); + ok(!strcmp(buf,"Y"), "output buffer %s\n", buf);
/* Win9x overwrites the tiny buffer and returns success, newer versions signal overflow. */ memset(buf, 0, sizeof(buf)); + buf[0] = 'Y'; parm.sys.dwNumber = 1; parm.sys.wDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO; /* ignored */ parm.sys.lpstrReturn = buf; parm.sys.dwRetSize = 2; /* too short for mysound\0 */ err = mciSendCommand(MCI_ALL_DEVICE_ID, MCI_SYSINFO, MCI_SYSINFO_NAME | MCI_SYSINFO_OPEN, (DWORD_PTR)&parm); ok(err==MCIERR_PARAM_OVERFLOW || broken(!err /* Win9x */),"mciCommand MCI_SYSINFO all name 1 open too small: %s\n", dbg_mcierr(err)); - if(!err) ok(!strcmp(buf,"mysound"), "sysinfo short name returned %s\n", buf); + ok(!strcmp(buf, err ? "Y" : "mysound"), "sysinfo short name returned %s\n", buf);
err = mciSendString("sysinfo mysound quantity open", buf, sizeof(buf), hwnd); ok(err==MCIERR_DEVICE_TYPE_REQUIRED,"sysinfo alias quantity: %s\n", dbg_mcierr(err)); @@ -455,12 +468,26 @@ static void test_openCloseWAVE(HWND hwnd) err = mciSendString("sysinfo all installname", buf, sizeof(buf), hwnd); ok(err==MCIERR_CANNOT_USE_ALL,"sysinfo all installname: %s\n", dbg_mcierr(err));
+ buf[0] = 'M'; buf[1] = 0; + parm.sys.lpstrReturn = buf; + parm.sys.dwRetSize = sizeof(buf); + err = mciSendCommand(MCI_ALL_DEVICE_ID, MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME, (DWORD_PTR)&parm); + ok(err==MCIERR_CANNOT_USE_ALL,"mciCommand MCI_SYSINFO all installname: %s\n", dbg_mcierr(err)); + ok(!strcmp(buf,"M"), "output buffer %s\n", buf); + err = mciSendString("sysinfo nodev installname", buf, sizeof(buf), hwnd); ok(err==MCIERR_INVALID_DEVICE_NAME,"sysinfo nodev installname: %s\n", dbg_mcierr(err)); ok(!buf[0], "sysinfo error buffer %s\n", buf);
+ buf[0] = 'K'; + parm.sys.lpstrReturn = buf; + parm.sys.dwRetSize = sizeof(buf); + err = mciSendCommandW(24000, MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME, (DWORD_PTR)&parm); + ok(err==MCIERR_INVALID_DEVICE_NAME || broken(err==MMSYSERR_NOTSUPPORTED/* Win9x */), "mciCommand MCI_SYSINFO nodev installname: %s\n", dbg_mcierr(err)); + ok(!strcmp(buf,"K"), "output buffer %s\n", buf); + err = mciGetDeviceID("all"); - ok(MCI_ALL_DEVICE_ID==err || /* Win9x */(UINT16)MCI_ALL_DEVICE_ID==err,"mciGetDeviceID all returned %u, expected %d\n", err, MCI_ALL_DEVICE_ID); + ok(MCI_ALL_DEVICE_ID==err || /* Win9x */(WORD)MCI_ALL_DEVICE_ID==err,"mciGetDeviceID all returned %u, expected %d\n", err, MCI_ALL_DEVICE_ID);
err = mciSendString(command_close_my, NULL, 0, hwnd); ok(!err,"mci %s returned %s\n", command_close_my, dbg_mcierr(err));