[PATCH 21/21] 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..7b7f27a 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();
+ }
+
+ for (i = 0; i < MMDrvsHi; ++i)
+ MMDRV_InitPerType(i, type, typenummsg[type]);
+ typeloaded[type] = 1;
+ ERR("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
--------------090003060202040407060607--
More information about the wine-patches
mailing list