[PATCH 14/16] winmm: Dont load drivers in DllMain

Maarten Lankhorst m.b.lankhorst at gmail.com
Mon Mar 15 08:07:26 CDT 2010


---
 dlls/winmm/lolvldrv.c |   82 ++++++++++++++++++++++++++++--------------------
 dlls/winmm/winemm.h   |    1 -
 dlls/winmm/winmm.c    |    4 --
 3 files changed, 48 insertions(+), 39 deletions(-)

diff --git a/dlls/winmm/lolvldrv.c b/dlls/winmm/lolvldrv.c
index 74b9f9d..5f162e1 100644
--- a/dlls/winmm/lolvldrv.c
+++ b/dlls/winmm/lolvldrv.c
@@ -47,7 +47,17 @@ typedef struct tagWINE_LLTYPE {
     int			nMapper;	/* index to mapper */
 } WINE_LLTYPE;
 
-static int		MMDrvsHi /* = 0 */;
+static DWORD typeloaded[MMDRV_MAX];
+static DWORD typenummsg[MMDRV_MAX] = {
+    AUXDM_GETNUMDEVS,
+    MXDM_GETNUMDEVS,
+    MIDM_GETNUMDEVS,
+    MODM_GETNUMDEVS,
+    WIDM_GETNUMDEVS,
+    WODM_GETNUMDEVS
+};
+
+static int drivers_loaded, MMDrvsHi;
 static WINE_MM_DRIVER	MMDrvs[8];
 static LPWINE_MLD	MM_MLDrvs[40];
 #define MAX_MM_MLDRVS	(sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]))
@@ -66,6 +76,26 @@ static WINE_LLTYPE	llTypes[MMDRV_MAX] = {
 };
 #undef A
 
+static BOOL MMDRV_InitPerType(DWORD idx, UINT type, UINT wMsg);
+static void MMDRV_Init(void);
+
+static void MMDRV_InitSingleType(UINT type) {
+    DWORD i;
+
+    if (typeloaded[type])
+        return;
+
+    if (!drivers_loaded) {
+        drivers_loaded = 1;
+        MMDRV_Init();
+    }
+
+    typeloaded[type] = 1;
+    for (i = 0; i < MMDrvsHi; ++i)
+        MMDRV_InitPerType(i, type, typenummsg[type]);
+    TRACE("loaded type %s\n", llTypes[type].typestr);
+}
+
 /**************************************************************************
  * 			MMDRV_GetNum				[internal]
  */
@@ -73,6 +103,7 @@ UINT	MMDRV_GetNum(UINT type)
 {
     TRACE("(%04x)\n", type);
     assert(type < MMDRV_MAX);
+    MMDRV_InitSingleType(type);
     return llTypes[type].wMaxId;
 }
 
@@ -110,14 +141,6 @@ DWORD  MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1,
     lpDrv = &MMDrvs[mld->mmdIndex];
     part = &lpDrv->parts[mld->type];
 
-#if 0
-    /* some sanity checks */
-    if (!(part->nIDMin <= devID))
-	ERR("!(part->nIDMin(%d) <= devID(%d))\n", part->nIDMin, devID);
-    if (!(devID < part->nIDMax))
-	ERR("!(devID(%d) < part->nIDMax(%d))\n", devID, part->nIDMax);
-#endif
-
     assert(part->fnMessage32);
 
     TRACE("Calling message(dev=%u msg=%u usr=0x%08lx p1=0x%08lx p2=0x%08lx)\n",
@@ -198,6 +221,7 @@ DWORD MMDRV_Open(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, DWORD dwFlags)
     WINE_LLTYPE*	llType = &llTypes[mld->type];
     TRACE("(%p, %04x, 0x%08lx, 0x%08x)\n", mld, wMsg, dwParam1, dwFlags);
 
+    MMDRV_InitSingleType(mld->type);
     mld->dwDriverInstance = (DWORD_PTR)&dwInstance;
 
     if (mld->uDeviceID == (UINT)-1 || mld->uDeviceID == (UINT16)-1) {
@@ -265,6 +289,7 @@ LPWINE_MLD	MMDRV_Get(HANDLE _hndl, UINT type, BOOL bCanBeID)
     TRACE("(%p, %04x, %c)\n", _hndl, type, bCanBeID ? 'Y' : 'N');
 
     assert(type < MMDRV_MAX);
+    MMDRV_InitSingleType(type);
 
     if (hndl >= llTypes[type].wMaxId &&
 	hndl != (UINT16)-1 && hndl != (UINT)-1) {
@@ -363,8 +388,9 @@ UINT	MMDRV_PhysicalFeatures(LPWINE_MLD mld, UINT uMsg,
 /**************************************************************************
  * 				MMDRV_InitPerType		[internal]
  */
-static  BOOL	MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg)
+static  BOOL	MMDRV_InitPerType(DWORD idx, UINT type, UINT wMsg)
 {
+    LPWINE_MM_DRIVER lpDrv = MMDrvs+idx;
     WINE_MM_DRIVER_PART*	part = &lpDrv->parts[type];
     DWORD			ret;
     UINT			count = 0;
@@ -399,7 +425,7 @@ static  BOOL	MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg)
 		llTypes[type].typestr, llTypes[type].nMapper, lpDrv->drvname);
 	if (count > 1)
 	    ERR("Strange: mapper with %d > 1 devices\n", count);
-	llTypes[type].nMapper = MMDrvsHi;
+	llTypes[type].nMapper = idx;
     } else {
 	if (count == 0)
 	    return FALSE;
@@ -428,7 +454,7 @@ static  BOOL	MMDRV_InitPerType(LPWINE_MM_DRIVER lpDrv, UINT type, UINT wMsg)
 	llTypes[type].lpMlds[-1].mmdIndex = llTypes[type].nMapper;
 	llTypes[type].lpMlds[-1].dwDriverInstance = 0;
     }
-    for (i = k = 0; i <= MMDrvsHi; i++) {
+    for (i = k = 0; i <= idx; i++) {
 	while (MMDrvs[i].parts[type].nIDMin <= k && k < MMDrvs[i].parts[type].nIDMax) {
 	    TRACE("%s:Trans[%d] -> %s\n", llTypes[type].typestr, k, MMDrvs[i].drvname);
 	    llTypes[type].lpMlds[k].uDeviceID = k;
@@ -504,22 +530,6 @@ static	BOOL	MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper)
     lpDrv->bIsMapper = bIsMapper;
     lpDrv->drvname = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(drvRegName) + 1), drvRegName);
 
-    /* Finish init and get the count of the devices */
-    i = 0;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_AUX,     AUXDM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_MIXER,   MXDM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_MIDIIN,  MIDM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_MIDIOUT, MODM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_WAVEIN,  WIDM_GETNUMDEVS))	i = 1;
-    if (MMDRV_InitPerType(lpDrv, MMDRV_WAVEOUT, WODM_GETNUMDEVS))	i = 1;
-    /* if all those func calls return FALSE, then the driver must be unloaded */
-    if (!i) {
-	CloseDriver(lpDrv->hDriver, 0, 0);
-	HeapFree(GetProcessHeap(), 0, lpDrv->drvname);
-	WARN("Driver initialization failed\n");
-	return FALSE;
-    }
-
     MMDrvsHi++;
 
     return TRUE;
@@ -528,7 +538,7 @@ static	BOOL	MMDRV_Install(LPCSTR drvRegName, LPCSTR drvFileName, BOOL bIsMapper)
 /**************************************************************************
  * 				MMDRV_Init
  */
-BOOL	MMDRV_Init(void)
+static void MMDRV_Init(void)
 {
     HKEY	hKey;
     char	driver_buffer[256];
@@ -536,7 +546,6 @@ BOOL	MMDRV_Init(void)
     char	midi_buffer[256];
     char*	p;
     DWORD	type, size;
-    BOOL	ret = FALSE;
     TRACE("()\n");
 
     strcpy(driver_buffer, WINE_DEFAULT_WINMM_DRIVER);
@@ -558,13 +567,12 @@ BOOL	MMDRV_Init(void)
         char *next = strchr(p, ',');
         if (next) *next++ = 0;
         sprintf( filename, "wine%s.drv", p );
-        if ((ret = MMDRV_Install( filename, filename, FALSE ))) break;
+        MMDRV_Install( filename, filename, FALSE );
         p = next;
     }
 
-    ret |= MMDRV_Install("wavemapper", WINE_DEFAULT_WINMM_MAPPER, TRUE);
-    ret |= MMDRV_Install("midimapper", WINE_DEFAULT_WINMM_MIDI, TRUE);
-    return ret;
+    MMDRV_Install("wavemapper", WINE_DEFAULT_WINMM_MAPPER, TRUE);
+    MMDRV_Install("midimapper", WINE_DEFAULT_WINMM_MIDI, TRUE);
 }
 
 /******************************************************************
@@ -578,6 +586,9 @@ static  BOOL	MMDRV_ExitPerType(LPWINE_MM_DRIVER lpDrv, UINT type)
     DWORD			ret;
     TRACE("(%p, %04x)\n", lpDrv, type);
 
+    if (!typeloaded[type])
+        return FALSE;
+
     if (part->fnMessage32) {
 #if 0
         ret = part->fnMessage32(0, DRVM_DISABLE, 0L, 0L, 0L);
@@ -600,6 +611,9 @@ void    MMDRV_Exit(void)
     unsigned int i;
     TRACE("()\n");
 
+    if (!drivers_loaded)
+        return;
+
     for (i = 0; i < sizeof(MM_MLDrvs) / sizeof(MM_MLDrvs[0]); i++)
     {
         if (MM_MLDrvs[i] != NULL)
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h
index 7920e2e..45a4233 100644
--- a/dlls/winmm/winemm.h
+++ b/dlls/winmm/winemm.h
@@ -137,7 +137,6 @@ BOOL		DRIVER_GetLibName(LPCWSTR keyName, LPCWSTR sectName, LPWSTR buf, int sz);
 LPWINE_DRIVER	DRIVER_TryOpenDriver32(LPCWSTR fn, LPARAM lParam2);
 void            DRIVER_UnloadAll(void);
 
-BOOL		MMDRV_Init(void);
 void            MMDRV_Exit(void);
 UINT		MMDRV_GetNum(UINT);
 LPWINE_MLD	MMDRV_Alloc(UINT size, UINT type, LPHANDLE hndl, DWORD* dwFlags,
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 99e0361..199e264 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -155,10 +155,6 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
 
 	if (!WINMM_CreateIData(hInstDLL))
 	    return FALSE;
-        if (!MMDRV_Init()) {
-            WINMM_DeleteIData();
-            return FALSE;
-	}
 	break;
     case DLL_PROCESS_DETACH:
         /* close all opened MCI drivers */
-- 
1.7.0



--------------090704020108070002060508--



More information about the wine-patches mailing list