winmm 16/32 split (#9)
Eric Pouech
eric.pouech at wanadoo.fr
Tue Oct 29 09:29:09 CST 2002
ChangeLog:
- revisited mmsystem/winmm loading mechanism
- added WINMM_CheckMMSystem function (helps 32 bit code detect presence
of our own mmsystem DLL)
- some internal renaming (MULTIMEDIA => WINMM)
the WINMM_CheckMMSystem kludge is needed because:
- we only set up our own 16 bit hooks when mmsystem is loaded
- as we allow loading of 16 bit drivers (even if only 32 APIs are used),
we need to force somehow the loading of mmsystem
- we don't do it by default, only when it's needed (thru
WINMM_CheckMMSystem)
- implementation should gracefully fails if we're not using wine's
kernel32 (for example on Mingw)
A+
-------------- next part --------------
--- winmm_8/mmsystem.c Tue Oct 29 15:04:10 2002
+++ winmm_9/mmsystem.c Tue Oct 29 14:19:36 2002
@@ -66,32 +66,27 @@
BOOL WINAPI MMSYSTEM_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds,
WORD wHeapSize, DWORD dwReserved1, WORD wReserved2)
{
- HANDLE hndl;
-
TRACE("0x%x 0x%lx\n", hinstDLL, fdwReason);
switch (fdwReason) {
case DLL_PROCESS_ATTACH:
/* need to load WinMM in order to:
- * - initiate correctly shared variables (MULTIMEDIA_Init())
- * - create correctly the per process WINE_MM_IDATA chunk
+ * - initiate correctly shared variables (WINMM_Init())
*/
- hndl = LoadLibraryA("WINMM.DLL");
-
- if (!hndl) {
- ERR("Could not load sibling WinMM.dll\n");
- return FALSE;
+ if (!GetModuleHandleA("WINMM.DLL") && !LoadLibraryA("WINMM.DLL"))
+ {
+ ERR("Could not load sibling WinMM.dll\n");
+ return FALSE;
}
WINMM_IData->hWinMM16Instance = hinstDLL;
- WINMM_IData->h16Module32 = hndl;
/* hook in our 16 bit function pointers */
- pFnMmioCallback16 = MMIO_Callback16;
pFnGetMMThread16 = WINMM_GetmmThread;
+ pFnMmioCallback16 = MMIO_Callback16;
break;
case DLL_PROCESS_DETACH:
- FreeLibrary(WINMM_IData->h16Module32);
- pFnMmioCallback16 = NULL;
+ WINMM_IData->hWinMM16Instance = 0;
pFnGetMMThread16 = NULL;
+ pFnMmioCallback16 = NULL;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
--- winmm_8/winemm.h Tue Oct 29 16:09:24 2002
+++ winmm_9/winemm.h Tue Oct 29 16:10:12 2002
@@ -254,6 +254,8 @@
DWORD MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
DWORD MCI_SendCommandFrom16(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
+BOOL WINMM_CheckForMMSystem(void);
+
void MMSYSTEM_MMTIME16to32(LPMMTIME mmt32, const MMTIME16* mmt16);
void MMSYSTEM_MMTIME32to16(LPMMTIME16 mmt16, const MMTIME* mmt32);
--- winmm_8/winmm.c Sat Oct 26 15:06:40 2002
+++ winmm_9/winmm.c Tue Oct 29 14:00:19 2002
@@ -75,9 +75,9 @@
LPWINE_MM_IDATA WINMM_IData /* = NULL */;
/**************************************************************************
- * MULTIMEDIA_CreateIData [internal]
+ * WINMM_CreateIData [internal]
*/
-static BOOL MULTIMEDIA_CreateIData(HINSTANCE hInstDLL)
+static BOOL WINMM_CreateIData(HINSTANCE hInstDLL)
{
WINMM_IData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MM_IDATA));
@@ -93,9 +93,9 @@
}
/**************************************************************************
- * MULTIMEDIA_DeleteIData [internal]
+ * WINMM_DeleteIData [internal]
*/
-static void MULTIMEDIA_DeleteIData(void)
+static void WINMM_DeleteIData(void)
{
if (WINMM_IData) {
TIME_MMTimeStop();
@@ -110,6 +110,30 @@
}
}
+/******************************************************************
+ * WINMM_LoadMMSystem
+ *
+ */
+BOOL WINMM_CheckForMMSystem(void)
+{
+ /* 0 is not checked yet, -1 is not present, 1 is present */
+ static int loaded /* = 0 */;
+
+ if (loaded == 0)
+ {
+ HANDLE h = GetModuleHandleA("kernel32");
+ loaded = -1;
+ if (h)
+ {
+ HANDLE (WINAPI *gmh)(LPCSTR) = (void*)GetProcAddress(h, "GetModuleHandle16");
+ DWORD (WINAPI *ll)(LPCSTR) = (void*)GetProcAddress(h, "LoadLibrary16");
+ if (gmh && ll && (gmh("MMSYSTEM.DLL") || ll("MMSYSTEM.DLL")))
+ loaded = 1;
+ }
+ }
+ return loaded > 0;
+}
+
/**************************************************************************
* DllEntryPoint (WINMM.init)
*
@@ -122,15 +146,15 @@
switch (fdwReason) {
case DLL_PROCESS_ATTACH:
- if (!MULTIMEDIA_CreateIData(hInstDLL))
+ if (!WINMM_CreateIData(hInstDLL))
return FALSE;
if (!MULTIMEDIA_MciInit() || !MMDRV_Init()) {
- MULTIMEDIA_DeleteIData();
+ WINMM_DeleteIData();
return FALSE;
}
break;
case DLL_PROCESS_DETACH:
- MULTIMEDIA_DeleteIData();
+ WINMM_DeleteIData();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
More information about the wine-patches
mailing list