msvfw32/tests: ICCOpen() is case-insensitive on MS-Windows.
[wine] / dlls / winmm / lolvldrv.c
index 0b62099..88e3ce4 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
 
 /*
- * MMSYTEM low level drivers handling functions
+ * MMSYSTEM low level drivers handling functions
  *
  * Copyright 1999 Eric Pouech
  *
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include "config.h"
+#include "wine/port.h"
+
 #include <string.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -27,9 +30,9 @@
 #include "windef.h"
 #include "winbase.h"
 #include "winreg.h"
-#include "winver.h"
 #include "winemm.h"
 #include "wine/debug.h"
+#include "wine/exception.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(winmm);
 
@@ -47,7 +50,7 @@ typedef struct tagWINE_LLTYPE {
     MMDRV_UNMAPFUNC    UnMap32ATo16;   /*   low-func (in .drv) do not match */
     LPDRVCALLBACK      Callback;       /* handles callback for a specified type */
     /* those attributes reflect the loaded/current situation for the type */
-    UINT               wMaxId;         /* number of loaded devices (sum across all loaded drivers */
+    UINT               wMaxId;         /* number of loaded devices (sum across all loaded drivers) */
     LPWINE_MLD         lpMlds;         /* "static" mlds to access the part though device IDs */
     int                        nMapper;        /* index to mapper */
 } WINE_LLTYPE;
@@ -99,68 +102,6 @@ BOOL            MMDRV_Is32(unsigned int idx)
     return MMDrvs[idx].bIs32;
 }
 
-/**************************************************************************
- *                             MMDRV_GetDescription32          [internal]
- */
-static BOOL    MMDRV_GetDescription32(const char* fname, char* buf, int buflen)
-{
-    OFSTRUCT           ofs;
-    DWORD      h;
-    LPVOID     ptr = 0;
-    LPVOID     val;
-    DWORD      dw;
-    BOOL       ret = FALSE;
-    UINT       u;
-    FARPROC pGetFileVersionInfoSizeA;
-    FARPROC pGetFileVersionInfoA;
-    FARPROC pVerQueryValueA;
-    HMODULE hmodule = 0;
-    TRACE("(%p, %p, %d)\n", fname, buf, buflen);
-
-#define E(_x)  do {TRACE _x;goto theEnd;} while(0)
-
-    if (OpenFile(fname, &ofs, OF_EXIST)==HFILE_ERROR)          E(("Can't find file %s\n", fname));
-
-    if (!(hmodule = LoadLibraryA( "version.dll" ))) goto theEnd;
-    if (!(pGetFileVersionInfoSizeA = GetProcAddress( hmodule, "GetFileVersionInfoSizeA" )))
-        goto theEnd;
-    if (!(pGetFileVersionInfoA = GetProcAddress( hmodule, "GetFileVersionInfoA" )))
-        goto theEnd;
-    if (!(pVerQueryValueA = GetProcAddress( hmodule, "VerQueryValueA" )))
-        goto theEnd;
-
-    if (!(dw = pGetFileVersionInfoSizeA(ofs.szPathName, &h)))  E(("Can't get FVIS\n"));
-    if (!(ptr = HeapAlloc(GetProcessHeap(), 0, dw)))           E(("OOM\n"));
-    if (!pGetFileVersionInfoA(ofs.szPathName, h, dw, ptr))     E(("Can't get FVI\n"));
-
-#define        A(_x) if (pVerQueryValueA(ptr, "\\StringFileInfo\\040904B0\\" #_x, &val, &u)) \
-                  TRACE(#_x " => %s\n", (LPSTR)val); else TRACE(#_x " @\n")
-
-    A(CompanyName);
-    A(FileDescription);
-    A(FileVersion);
-    A(InternalName);
-    A(LegalCopyright);
-    A(OriginalFilename);
-    A(ProductName);
-    A(ProductVersion);
-    A(Comments);
-    A(LegalTrademarks);
-    A(PrivateBuild);
-    A(SpecialBuild);
-#undef A
-
-    if (!pVerQueryValueA(ptr, "\\StringFileInfo\\040904B0\\ProductName", &val, &u)) E(("Can't get product name\n"));
-    lstrcpynA(buf, val, buflen);
-
-#undef E
-    ret = TRUE;
-theEnd:
-    HeapFree(GetProcessHeap(), 0, ptr);
-    if (hmodule) FreeLibrary( hmodule );
-    return ret;
-}
-
 /**************************************************************************
  *                     MMDRV_GetNum                            [internal]
  */
@@ -184,7 +125,7 @@ DWORD  MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1,
     WINMM_MapType              map;
     int                                devID;
 
-    TRACE("(%s %u %u 0x%08lx 0x%08lx 0x%08lx %c)\n",
+    TRACE("(%s %u %u 0x%08x 0x%08lx 0x%08lx %c)\n",
          llTypes[mld->type].typestr, mld->uDeviceID, wMsg,
          mld->dwDriverInstance, dwParam1, dwParam2, bFrom32?'Y':'N');
 
@@ -218,7 +159,7 @@ DWORD  MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1,
        assert(part->u.fnMessage32);
 
        if (bFrom32) {
-           TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
+           TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n",
                  mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
             ret = part->u.fnMessage32(mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
            TRACE("=> %s\n", WINMM_ErrorToString(ret));
@@ -234,7 +175,7 @@ DWORD  MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1,
                break;
            case WINMM_MAP_OK:
            case WINMM_MAP_OKMEM:
-               TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
+               TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n",
                      mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
                ret = part->u.fnMessage32(mld->uDeviceID, wMsg, mld->dwDriverInstance,
                                          dwParam1, dwParam2);
@@ -263,7 +204,7 @@ DWORD  MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1,
                break;
            case WINMM_MAP_OK:
            case WINMM_MAP_OKMEM:
-               TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
+               TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n",
                      mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
                ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, 
                                          mld->uDeviceID, wMsg, mld->dwDriverInstance, 
@@ -278,7 +219,7 @@ DWORD  MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1,
                break;
            }
        } else {
-           TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
+           TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n",
                  mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2);
             ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, 
                                      mld->uDeviceID, wMsg, mld->dwDriverInstance, 
@@ -293,7 +234,7 @@ DWORD  MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1,
  *                             MMDRV_Alloc                     [internal]
  */
 LPWINE_MLD     MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags,
-                           DWORD* dwCallback, DWORD* dwInstance, BOOL bFrom32)
+                           DWORD_PTR* dwCallback, DWORD_PTR* dwInstance, BOOL bFrom32)
 {
     LPWINE_MLD mld;
     UINT i;
@@ -332,8 +273,8 @@ LPWINE_MLD  MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags,
     if (llTypes[type].Callback)
     {
         *dwFlags = LOWORD(*dwFlags) | CALLBACK_FUNCTION;
-        *dwCallback = (DWORD)llTypes[type].Callback;
-        *dwInstance = (DWORD)mld; /* FIXME: wouldn't some 16 bit drivers only use the loword ? */
+        *dwCallback = (DWORD_PTR)llTypes[type].Callback;
+        *dwInstance = (DWORD_PTR)mld; /* FIXME: wouldn't some 16 bit drivers only use the loword ? */
     }
 
     return mld;
@@ -365,7 +306,7 @@ DWORD       MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD dwParam1, DWORD dwFlags)
     DWORD              dwRet = MMSYSERR_BADDEVICEID;
     DWORD              dwInstance;
     WINE_LLTYPE*       llType = &llTypes[mld->type];
-    TRACE("(%p, %04x, 0x%08lx, 0x%08lx)\n", mld, wMsg, dwParam1, dwFlags);
+    TRACE("(%p, %04x, 0x%08x, 0x%08x)\n", mld, wMsg, dwParam1, dwFlags);
 
     mld->dwDriverInstance = (DWORD)&dwInstance;
 
@@ -414,7 +355,7 @@ DWORD       MMDRV_Close(LPWINE_MLD mld, UINT wMsg)
 /**************************************************************************
  *                             MMDRV_GetByID                   [internal]
  */
-LPWINE_MLD     MMDRV_GetByID(UINT uDevID, UINT type)
+static LPWINE_MLD MMDRV_GetByID(UINT uDevID, UINT type)
 {
     TRACE("(%04x, %04x)\n", uDevID, type);
     if (uDevID < llTypes[type].wMaxId)
@@ -438,13 +379,19 @@ LPWINE_MLD        MMDRV_Get(HANDLE _hndl, UINT type, BOOL bCanBeID)
     if (hndl >= llTypes[type].wMaxId &&
        hndl != (UINT16)-1 && hndl != (UINT)-1) {
        if (hndl & 0x8000) {
-           hndl = hndl & ~0x8000;
-           if (hndl < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) {
-               mld = MM_MLDrvs[hndl];
-               if (!mld || !HeapValidate(GetProcessHeap(), 0, mld) || mld->type != type)
-                   mld = NULL;
+           UINT idx = hndl & ~0x8000;
+           if (idx < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0])) {
+                __TRY
+                {
+                    mld = MM_MLDrvs[idx];
+                    if (mld && mld->type != type) mld = NULL;
+                }
+                __EXCEPT_PAGE_FAULT
+                {
+                    mld = NULL;
+                }
+                __ENDTRY;
            }
-           hndl = hndl | 0x8000;
        }
     }
     if (mld == NULL && bCanBeID) {
@@ -474,8 +421,8 @@ LPWINE_MLD  MMDRV_GetRelated(HANDLE hndl, UINT srcType,
 /**************************************************************************
  *                             MMDRV_PhysicalFeatures          [internal]
  */
-UINT   MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg, DWORD dwParam1,
-                              DWORD dwParam2)
+UINT   MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg,
+                               DWORD_PTR dwParam1, DWORD_PTR dwParam2)
 {
     WINE_MM_DRIVER*    lpDrv = &MMDrvs[mld->mmdIndex];
 
@@ -657,7 +604,6 @@ static      BOOL    MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper)
 
     if (lpDrv->bIs32) {
        WINEMM_msgFunc32        func;
-        char                   buffer[128];
 
        if (d->d.d32.hModule) {
 #define A(_x,_y)       AA(d->d.d32.hModule,_x,_y,32,GetProcAddress)
@@ -669,12 +615,6 @@ static     BOOL    MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper)
            A(MMDRV_WAVEOUT,    wodMessage);
 #undef A
        }
-        if (TRACE_ON(winmm)) {
-            if (MMDRV_GetDescription32(drvFileName, buffer, sizeof(buffer)))
-               TRACE("%s => %s\n", drvFileName, buffer);
-           else
-               TRACE("%s => No description\n", drvFileName);
-        }
     } else if (WINMM_CheckForMMSystem() && pFnLoadMMDrvFunc16) {
         count += pFnLoadMMDrvFunc16(drvFileName, d, lpDrv);
     }
@@ -723,8 +663,7 @@ BOOL        MMDRV_Init(void)
     char       driver_buffer[256];
     char       mapper_buffer[256];
     char       midi_buffer[256];
-    char*      p1;
-    char*      p2;
+    char*      p;
     DWORD      type, size;
     BOOL       ret = FALSE;
     TRACE("()\n");
@@ -733,34 +672,27 @@ BOOL      MMDRV_Init(void)
     strcpy(mapper_buffer, WINE_DEFAULT_WINMM_MAPPER);
     strcpy(midi_buffer, WINE_DEFAULT_WINMM_MIDI);
 
-    /* @@ Wine registry key: HKLM\Software\Wine\Wine\Config\WinMM */
-    if (! RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\WinMM", &hKey)) {
+    /* @@ Wine registry key: HKCU\Software\Wine\Drivers */
+    if (!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Drivers", &hKey))
+    {
         size = sizeof(driver_buffer);
-        if (RegQueryValueExA(hKey, "Drivers", 0, &type, (LPVOID)driver_buffer, &size)) 
+        if (RegQueryValueExA(hKey, "Audio", 0, &type, (LPVOID)driver_buffer, &size))
             strcpy(driver_buffer, WINE_DEFAULT_WINMM_DRIVER);
-
-        /* finish with mappers */
-        size = sizeof(mapper_buffer);
-        if (RegQueryValueExA(hKey, "WaveMapper", 0, &type, (LPVOID)mapper_buffer, &size))
-            strcpy(mapper_buffer, WINE_DEFAULT_WINMM_MAPPER);
-
-        size = sizeof(midi_buffer);
-        if (RegQueryValueExA(hKey, "MidiMapper", 0, &type, (LPVOID)midi_buffer, &size))
-            strcpy(midi_buffer, WINE_DEFAULT_WINMM_MIDI);
-
-        RegCloseKey(hKey);
     }
 
-    p1 = driver_buffer;
-    while (p1) {
-        p2 = strchr(p1, ';');
-        if (p2) *p2++ = '\0';
-        ret |= MMDRV_Install(p1, p1, FALSE);
-        p1 = p2;
+    p = driver_buffer;
+    while (p)
+    {
+        char filename[sizeof(driver_buffer)+10];
+        char *next = strchr(p, ',');
+        if (next) *next++ = 0;
+        sprintf( filename, "wine%s.drv", p );
+        if ((ret = MMDRV_Install( filename, filename, FALSE ))) break;
+        p = next;
     }
 
-    ret |= MMDRV_Install("wavemapper", mapper_buffer, TRUE);
-    ret |= MMDRV_Install("midimapper", midi_buffer, TRUE);
+    ret |= MMDRV_Install("wavemapper", WINE_DEFAULT_WINMM_MAPPER, TRUE);
+    ret |= MMDRV_Install("midimapper", WINE_DEFAULT_WINMM_MIDI, TRUE);
     return ret;
 }
 
@@ -805,7 +737,7 @@ static  BOOL        MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type)
  */
 void    MMDRV_Exit(void)
 {
-    int i;
+    unsigned int i;
     TRACE("()\n");
 
     for (i = 0; i < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]); i++)
@@ -821,7 +753,8 @@ void    MMDRV_Exit(void)
     }
 
     /* unload driver, in reverse order of loading */
-    for (i = sizeof(MMDrvs) / sizeof(MMDrvs[0]) - 1; i >= 0; i--)
+    i = sizeof(MMDrvs) / sizeof(MMDrvs[0]);
+    while (i-- > 0)
     {
         MMDRV_ExitPerType(&MMDrvs[i], MMDRV_AUX);
         MMDRV_ExitPerType(&MMDrvs[i], MMDRV_MIXER);
@@ -831,4 +764,16 @@ void    MMDRV_Exit(void)
         MMDRV_ExitPerType(&MMDrvs[i], MMDRV_WAVEOUT);
         CloseDriver(MMDrvs[i].hDriver, 0, 0);
     }
+    if (llTypes[MMDRV_AUX].lpMlds)
+        HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_AUX].lpMlds - 1);
+    if (llTypes[MMDRV_MIXER].lpMlds)
+        HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_MIXER].lpMlds - 1);
+    if (llTypes[MMDRV_MIDIIN].lpMlds)
+        HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_MIDIIN].lpMlds - 1);
+    if (llTypes[MMDRV_MIDIOUT].lpMlds)
+        HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_MIDIOUT].lpMlds - 1);
+    if (llTypes[MMDRV_WAVEIN].lpMlds)
+        HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_WAVEIN].lpMlds - 1);
+    if (llTypes[MMDRV_WAVEOUT].lpMlds)
+        HeapFree(GetProcessHeap(), 0, llTypes[MMDRV_WAVEOUT].lpMlds - 1);
 }