midimap: Obey the size parameter in GetDevCaps.
authorJörg Höhle <hoehle@users.sourceforge.net>
Wed, 10 Feb 2010 07:55:00 +0000 (08:55 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 11 Feb 2010 13:38:44 +0000 (14:38 +0100)
dlls/midimap/midimap.c

index 129427fa94c65ade01ebf7fd45804090856b0236..24fc645188b297612b396e6a32773227d9d5db36 100644 (file)
@@ -448,18 +448,16 @@ static DWORD modSetVolume(MIDIMAPDATA* mom, DWORD dwVolume)
 
 static DWORD modGetDevCaps(UINT wDevID, MIDIMAPDATA* mom, LPMIDIOUTCAPSW lpMidiCaps, DWORD_PTR size)
 {
-    static const WCHAR name[] = {'W','i','n','e',' ','m','i','d','i',' ','m','a','p','p','e','r',0};
-    lpMidiCaps->wMid = 0x00FF;
-    lpMidiCaps->wPid = 0x0001;
-    lpMidiCaps->vDriverVersion = 0x0100;
-    lstrcpyW(lpMidiCaps->szPname, name);
-    lpMidiCaps->wTechnology = MOD_MAPPER;
-    lpMidiCaps->wVoices = 0;
-    lpMidiCaps->wNotes = 0;
-    lpMidiCaps->wChannelMask = 0xFFFF;
-    /* Native returns volume caps of underlying device | MIDICAPS_STREAM */
-    lpMidiCaps->dwSupport = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME;
-
+    static const MIDIOUTCAPSW mappercaps = {
+       0x00FF, 0x0001, 0x0100, /* Manufacturer and Product ID */
+       {'W','i','n','e',' ','m','i','d','i',' ','m','a','p','p','e','r',0},
+       MOD_MAPPER, 0, 0, 0xFFFF,
+       /* Native returns volume caps of underlying device + MIDICAPS_STREAM */
+       MIDICAPS_VOLUME|MIDICAPS_LRVOLUME
+    };
+    if (lpMidiCaps == NULL) return MMSYSERR_INVALPARAM;
+
+    memcpy(lpMidiCaps, &mappercaps, min(size, sizeof(*lpMidiCaps)));
     return MMSYSERR_NOERROR;
 }