winmm GetCapsW patch
Robert Reif
reif at earthlink.net
Tue Jul 20 18:46:34 CDT 2004
Adds *GetDevCapsW bad pointer check.
Adds waveOutGetDevCapsW test.
-------------- next part --------------
Index: dlls/winmm/winmm.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winmm.c,v
retrieving revision 1.38
diff -u -r1.38 winmm.c
--- dlls/winmm/winmm.c 30 Jun 2004 18:12:20 -0000 1.38
+++ dlls/winmm/winmm.c 20 Jul 2004 23:39:54 -0000
@@ -281,8 +281,11 @@
UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize)
{
MIXERCAPSA micA;
- UINT ret = mixerGetDevCapsA(uDeviceID, &micA, sizeof(micA));
+ UINT ret;
+
+ if (lpCaps == NULL) return MMSYSERR_INVALPARAM;
+ ret = mixerGetDevCapsA(uDeviceID, &micA, sizeof(micA));
if (ret == MMSYSERR_NOERROR) {
MIXERCAPSW micW;
micW.wMid = micA.wMid;
@@ -662,8 +665,11 @@
UINT WINAPI auxGetDevCapsW(UINT_PTR uDeviceID, LPAUXCAPSW lpCaps, UINT uSize)
{
AUXCAPSA acA;
- UINT ret = auxGetDevCapsA(uDeviceID, &acA, sizeof(acA));
+ UINT ret;
+ if (lpCaps == NULL) return MMSYSERR_INVALPARAM;
+
+ ret = auxGetDevCapsA(uDeviceID, &acA, sizeof(acA));
if (ret == MMSYSERR_NOERROR) {
AUXCAPSW acW;
acW.wMid = acA.wMid;
@@ -1214,8 +1220,11 @@
UINT uSize)
{
MIDIOUTCAPSA mocA;
- UINT ret = midiOutGetDevCapsA(uDeviceID, &mocA, sizeof(mocA));
+ UINT ret;
+
+ if (lpCaps == NULL) return MMSYSERR_INVALPARAM;
+ ret = midiOutGetDevCapsA(uDeviceID, &mocA, sizeof(mocA));
if (ret == MMSYSERR_NOERROR) {
MIDIOUTCAPSW mocW;
mocW.wMid = mocA.wMid;
@@ -1591,8 +1600,11 @@
UINT WINAPI midiInGetDevCapsW(UINT_PTR uDeviceID, LPMIDIINCAPSW lpCaps, UINT uSize)
{
MIDIINCAPSA micA;
- UINT ret = midiInGetDevCapsA(uDeviceID, &micA, sizeof(micA));
+ UINT ret;
+
+ if (lpCaps == NULL) return MMSYSERR_INVALPARAM;
+ ret = midiInGetDevCapsA(uDeviceID, &micA, sizeof(micA));
if (ret == MMSYSERR_NOERROR) {
MIDIINCAPSW micW;
micW.wMid = micA.wMid;
@@ -2556,8 +2568,11 @@
UINT uSize)
{
WAVEOUTCAPSA wocA;
- UINT ret = waveOutGetDevCapsA(uDeviceID, &wocA, sizeof(wocA));
+ UINT ret;
+
+ if (lpCaps == NULL) return MMSYSERR_INVALPARAM;
+ ret = waveOutGetDevCapsA(uDeviceID, &wocA, sizeof(wocA));
if (ret == MMSYSERR_NOERROR) {
WAVEOUTCAPSW wocW;
wocW.wMid = wocA.wMid;
@@ -2926,8 +2941,11 @@
UINT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID, LPWAVEINCAPSW lpCaps, UINT uSize)
{
WAVEINCAPSA wicA;
- UINT ret = waveInGetDevCapsA(uDeviceID, &wicA, sizeof(wicA));
+ UINT ret;
+
+ if (lpCaps == NULL) return MMSYSERR_INVALPARAM;
+ ret = waveInGetDevCapsA(uDeviceID, &wicA, sizeof(wicA));
if (ret == MMSYSERR_NOERROR) {
WAVEINCAPSW wicW;
wicW.wMid = wicA.wMid;
Index: dlls/winmm/tests/wave.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/tests/wave.c,v
retrieving revision 1.34
diff -u -r1.34 wave.c
--- dlls/winmm/tests/wave.c 20 Jul 2004 22:09:53 -0000 1.34
+++ dlls/winmm/tests/wave.c 20 Jul 2004 23:39:55 -0000
@@ -379,13 +379,14 @@
static void wave_out_test_device(int device)
{
- WAVEOUTCAPS caps;
+ WAVEOUTCAPSA capsA;
+ WAVEOUTCAPSW capsW;
WAVEFORMATEX format, oformat;
HWAVEOUT wout;
MMRESULT rc;
UINT f;
- WCHAR * wname;
- CHAR * name;
+ WCHAR * nameW;
+ CHAR * nameA;
DWORD size;
DWORD dwPageSize;
BYTE * twoPages;
@@ -396,51 +397,67 @@
GetSystemInfo(&sSysInfo);
dwPageSize = sSysInfo.dwPageSize;
- rc=waveOutGetDevCapsA(device,&caps,sizeof(caps));
+ rc=waveOutGetDevCapsA(device,&capsA,sizeof(capsA));
ok(rc==MMSYSERR_NOERROR || rc==MMSYSERR_BADDEVICEID || rc==MMSYSERR_NODRIVER,
"waveOutGetDevCapsA: failed to get capabilities of device %s: rc=%s\n",dev_name(device),wave_out_error(rc));
if (rc==MMSYSERR_BADDEVICEID || rc==MMSYSERR_NODRIVER)
return;
- rc=waveOutGetDevCapsA(device,0,sizeof(caps));
+ rc=waveOutGetDevCapsW(device,&capsW,sizeof(capsW));
+ ok(rc==MMSYSERR_NOERROR,
+ "waveOutGetDevCapsW: failed to get capabilities of device %s: rc=%s\n",dev_name(device),wave_out_error(rc));
+
+ rc=waveOutGetDevCapsA(device,0,sizeof(capsA));
+ ok(rc==MMSYSERR_INVALPARAM,
+ "waveOutGetDevCapsA: MMSYSERR_INVALPARAM expected, got %s\n",wave_out_error(rc));
+
+ rc=waveOutGetDevCapsW(device,0,sizeof(capsW));
ok(rc==MMSYSERR_INVALPARAM,
"waveOutGetDevCapsA: MMSYSERR_INVALPARAM expected, got %s\n",wave_out_error(rc));
#if 0 /* FIXME: this works on windows but crashes wine */
- rc=waveOutGetDevCapsA(device,(LPWAVEOUTCAPS)1,sizeof(caps));
+ rc=waveOutGetDevCapsA(device,(LPWAVEOUTCAPSA)1,sizeof(capsA));
ok(rc==MMSYSERR_INVALPARAM,
"waveOutGetDevCapsA: MMSYSERR_INVALPARAM expected, got %s\n",wave_out_error(rc));
+
+ rc=waveOutGetDevCapsW(device,(LPWAVEOUTCAPSW)1,sizeof(capsW));
+ ok(rc==MMSYSERR_INVALPARAM,
+ "waveOutGetDevCapsW: MMSYSERR_INVALPARAM expected, got %s\n",wave_out_error(rc));
#endif
- rc=waveOutGetDevCapsA(device,&caps,4);
+ rc=waveOutGetDevCapsA(device,&capsA,4);
ok(rc==MMSYSERR_NOERROR,
"waveOutGetDevCapsA: MMSYSERR_NOERROR expected, got %s\n",wave_out_error(rc));
- name=NULL;
+ rc=waveOutGetDevCapsW(device,&capsW,4);
+ ok(rc==MMSYSERR_NOERROR,
+ "waveOutGetDevCapsW: MMSYSERR_NOERROR expected, got %s\n",wave_out_error(rc));
+
+ nameA=NULL;
rc=waveOutMessage((HWAVEOUT)device, DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0);
ok(rc==MMSYSERR_NOERROR || rc==MMSYSERR_INVALPARAM || rc==MMSYSERR_NOTSUPPORTED,
"waveOutMessage: failed to get interface size for device: %s rc=%s\n",dev_name(device),wave_out_error(rc));
if (rc==MMSYSERR_NOERROR) {
- wname = (WCHAR *)malloc(size);
- rc=waveOutMessage((HWAVEOUT)device, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wname, size);
+ nameW = (WCHAR *)malloc(size);
+ rc=waveOutMessage((HWAVEOUT)device, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)nameW, size);
ok(rc==MMSYSERR_NOERROR,"waveOutMessage: failed to get interface name for device: %s rc=%s\n",dev_name(device),wave_out_error(rc));
- ok(lstrlenW(wname)+1==size/sizeof(WCHAR),"got an incorrect size: %ld instead of %d\n",size,(lstrlenW(wname)+1)*sizeof(WCHAR));
+ ok(lstrlenW(nameW)+1==size/sizeof(WCHAR),"got an incorrect size: %ld instead of %d\n",size,(lstrlenW(nameW)+1)*sizeof(WCHAR));
if (rc==MMSYSERR_NOERROR) {
- name = malloc(size/sizeof(WCHAR));
- WideCharToMultiByte(CP_ACP, 0, wname, size/sizeof(WCHAR), name, size/sizeof(WCHAR), NULL, NULL);
+ nameA = malloc(size/sizeof(WCHAR));
+ WideCharToMultiByte(CP_ACP, 0, nameW, size/sizeof(WCHAR), nameA, size/sizeof(WCHAR), NULL, NULL);
}
- free(wname);
+ free(nameW);
}
else if (rc==MMSYSERR_NOTSUPPORTED) {
- name=strdup("not supported");
+ nameA=strdup("not supported");
}
trace(" %s: \"%s\" (%s) %d.%d (%d:%d): channels=%d formats=%05lx support=%04lx(%s)\n",
- dev_name(device),caps.szPname,(name?name:"failed"),caps.vDriverVersion >> 8,
- caps.vDriverVersion & 0xff,
- caps.wMid,caps.wPid,
- caps.wChannels,caps.dwFormats,caps.dwSupport,wave_out_caps(caps.dwSupport));
- free(name);
+ dev_name(device),capsA.szPname,(nameA?nameA:"failed"),capsA.vDriverVersion >> 8,
+ capsA.vDriverVersion & 0xff,
+ capsA.wMid,capsA.wPid,
+ capsA.wChannels,capsA.dwFormats,capsA.dwSupport,wave_out_caps(capsA.dwSupport));
+ free(nameA);
if (winetest_interactive && (device != WAVE_MAPPER))
{
@@ -454,7 +471,7 @@
format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;
format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;
format.cbSize=0;
- wave_out_test_deviceOut(device,5.0,&format,WAVE_FORMAT_2M08,0,&caps);
+ wave_out_test_deviceOut(device,5.0,&format,WAVE_FORMAT_2M08,0,&capsA);
}
for (f=0;f<NB_WIN_FORMATS;f++) {
@@ -465,10 +482,10 @@
format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;
format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;
format.cbSize=0;
- wave_out_test_deviceOut(device,1.0,&format,win_formats[f][0],0,&caps);
- wave_out_test_deviceOut(device,1.0,&format,win_formats[f][0],WAVE_FORMAT_DIRECT,&caps);
+ wave_out_test_deviceOut(device,1.0,&format,win_formats[f][0],0,&capsA);
+ wave_out_test_deviceOut(device,1.0,&format,win_formats[f][0],WAVE_FORMAT_DIRECT,&capsA);
if (device != WAVE_MAPPER)
- wave_out_test_deviceOut(device,1.0,&format,win_formats[f][0],WAVE_MAPPED,&caps);
+ wave_out_test_deviceOut(device,1.0,&format,win_formats[f][0],WAVE_MAPPED,&capsA);
}
/* Try a PCMWAVEFORMAT aligned next to an unaccessable page for bounds checking */
@@ -485,10 +502,10 @@
pwfx->nSamplesPerSec=22050;
pwfx->nBlockAlign=pwfx->nChannels*pwfx->wBitsPerSample/8;
pwfx->nAvgBytesPerSec=pwfx->nSamplesPerSec*pwfx->nBlockAlign;
- wave_out_test_deviceOut(device,1.0,pwfx,WAVE_FORMAT_2M08,0,&caps);
- wave_out_test_deviceOut(device,1.0,pwfx,WAVE_FORMAT_2M08,WAVE_FORMAT_DIRECT,&caps);
+ wave_out_test_deviceOut(device,1.0,pwfx,WAVE_FORMAT_2M08,0,&capsA);
+ wave_out_test_deviceOut(device,1.0,pwfx,WAVE_FORMAT_2M08,WAVE_FORMAT_DIRECT,&capsA);
if (device != WAVE_MAPPER)
- wave_out_test_deviceOut(device,1.0,pwfx,WAVE_FORMAT_2M08,WAVE_MAPPED,&caps);
+ wave_out_test_deviceOut(device,1.0,pwfx,WAVE_FORMAT_2M08,WAVE_MAPPED,&capsA);
}
VirtualFree(twoPages, 2 * dwPageSize, MEM_RELEASE);
}
More information about the wine-patches
mailing list