WINMM: make WINMM_IData statically allocated

Mike McCormack mike at codeweavers.com
Wed Apr 27 00:58:35 CDT 2005


This solves a problem when installing iTunes.

"during the reboot after iTunes installation a thread calls this
  function through mmioSeek after DllMain(DLL_PROCESS_DETACH) has been
  called, hence WINMM_IData is NULL. The proper fix is to not have
  WINMM_IData allocated on the heap as it doesn't need to be."

Mike


ChangeLog:
* make WINMM_IData statically allocated
-------------- next part --------------
Index: dlls/winmm/mci.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/mci.c,v
retrieving revision 1.61
diff -u -p -r1.61 mci.c
--- dlls/winmm/mci.c	21 Mar 2005 10:28:38 -0000	1.61
+++ dlls/winmm/mci.c	27 Apr 2005 05:55:41 -0000
@@ -104,12 +104,12 @@ LPWINE_MCIDRIVER	MCI_GetDriver(UINT16 wD
 {
     LPWINE_MCIDRIVER	wmd = 0;
 
-    EnterCriticalSection(&WINMM_IData->cs);
-    for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
+    EnterCriticalSection(&WINMM_IData.cs);
+    for (wmd = WINMM_IData.lpMciDrvs; wmd; wmd = wmd->lpNext) {
 	if (wmd->wDeviceID == wDevID)
 	    break;
     }
-    LeaveCriticalSection(&WINMM_IData->cs);
+    LeaveCriticalSection(&WINMM_IData.cs);
     return wmd;
 }
 
@@ -127,8 +127,8 @@ UINT	MCI_GetDriverFromString(LPCWSTR lps
     if (!strcmpiW(lpstrName, wszAll))
 	return MCI_ALL_DEVICE_ID;
 
-    EnterCriticalSection(&WINMM_IData->cs);
-    for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
+    EnterCriticalSection(&WINMM_IData.cs);
+    for (wmd = WINMM_IData.lpMciDrvs; wmd; wmd = wmd->lpNext) {
 	if (wmd->lpstrElementName && strcmpW(wmd->lpstrElementName, lpstrName) == 0) {
 	    ret = wmd->wDeviceID;
 	    break;
@@ -142,7 +142,7 @@ UINT	MCI_GetDriverFromString(LPCWSTR lps
 	    break;
 	}
     }
-    LeaveCriticalSection(&WINMM_IData->cs);
+    LeaveCriticalSection(&WINMM_IData.cs);
 
     return ret;
 }
@@ -679,7 +679,7 @@ static	UINT		MCI_GetCommandTable(UINT uD
 
     /* well try to load id */
     if (uDevType >= MCI_DEVTYPE_FIRST && uDevType <= MCI_DEVTYPE_LAST) {
-	if (LoadStringW(WINMM_IData->hWinMM32Instance, uDevType, buf, sizeof(buf) / sizeof(WCHAR))) {
+	if (LoadStringW(WINMM_IData.hWinMM32Instance, uDevType, buf, sizeof(buf) / sizeof(WCHAR))) {
 	    str = buf;
 	}
     } else if (uDevType == 0) {
@@ -688,15 +688,15 @@ static	UINT		MCI_GetCommandTable(UINT uD
     }
     uTbl = MCI_NO_COMMAND_TABLE;
     if (str) {
-	HRSRC 	hRsrc = FindResourceW(WINMM_IData->hWinMM32Instance, str, (LPCWSTR)RT_RCDATA);
+	HRSRC 	hRsrc = FindResourceW(WINMM_IData.hWinMM32Instance, str, (LPCWSTR)RT_RCDATA);
 	HANDLE	hMem = 0;
 
-	if (hRsrc) hMem = LoadResource(WINMM_IData->hWinMM32Instance, hRsrc);
+	if (hRsrc) hMem = LoadResource(WINMM_IData.hWinMM32Instance, hRsrc);
 	if (hMem) {
 	    uTbl = MCI_SetCommandTable(LockResource(hMem), uDevType);
 	} else {
 	    WARN("No command table found in resource %p[%s]\n",
-		 WINMM_IData->hWinMM32Instance, debugstr_w(str));
+		 WINMM_IData.hWinMM32Instance, debugstr_w(str));
 	}
     }
     TRACE("=> %d\n", uTbl);
@@ -799,14 +799,14 @@ static	BOOL	MCI_UnLoadMciDriver(LPWINE_M
     if (wmd->dwPrivate != 0)
 	WARN("Unloading mci driver with non nul dwPrivate field\n");
 
-    EnterCriticalSection(&WINMM_IData->cs);
-    for (tmp = &WINMM_IData->lpMciDrvs; *tmp; tmp = &(*tmp)->lpNext) {
+    EnterCriticalSection(&WINMM_IData.cs);
+    for (tmp = &WINMM_IData.lpMciDrvs; *tmp; tmp = &(*tmp)->lpNext) {
 	if (*tmp == wmd) {
 	    *tmp = wmd->lpNext;
 	    break;
 	}
     }
-    LeaveCriticalSection(&WINMM_IData->cs);
+    LeaveCriticalSection(&WINMM_IData.cs);
 
     HeapFree(GetProcessHeap(), 0, wmd->lpstrDeviceType);
     HeapFree(GetProcessHeap(), 0, wmd->lpstrAlias);
@@ -871,12 +871,12 @@ static	DWORD	MCI_LoadMciDriver(LPCWSTR _
     wmd->dwYieldData = VK_CANCEL;
     wmd->CreatorThread = GetCurrentThreadId();
 
-    EnterCriticalSection(&WINMM_IData->cs);
+    EnterCriticalSection(&WINMM_IData.cs);
     /* wmd must be inserted in list before sending opening the driver, coz' it
      * may want to lookup at wDevID
      */
-    wmd->lpNext = WINMM_IData->lpMciDrvs;
-    WINMM_IData->lpMciDrvs = wmd;
+    wmd->lpNext = WINMM_IData.lpMciDrvs;
+    WINMM_IData.lpMciDrvs = wmd;
 
     for (modp.wDeviceID = MCI_MAGIC;
 	 MCI_GetDriver(modp.wDeviceID) != 0;
@@ -884,7 +884,7 @@ static	DWORD	MCI_LoadMciDriver(LPCWSTR _
 
     wmd->wDeviceID = modp.wDeviceID;
 
-    LeaveCriticalSection(&WINMM_IData->cs);
+    LeaveCriticalSection(&WINMM_IData.cs);
 
     TRACE("wDevID=%04X \n", modp.wDeviceID);
 
@@ -1195,7 +1195,7 @@ static	DWORD	MCI_HandleReturnValues(DWOR
 	    case MCI_RESOURCE_RETURNED:
 		/* return string which ID is HIWORD(data[1]),
 		 * string is loaded from mmsystem.dll */
-		LoadStringW(WINMM_IData->hWinMM32Instance, HIWORD(data[1]),
+		LoadStringW(WINMM_IData.hWinMM32Instance, HIWORD(data[1]),
 			    lpstrRet, uRetLen);
 		break;
 	    case MCI_RESOURCE_RETURNED|MCI_RESOURCE_DRIVER:
@@ -1647,7 +1647,7 @@ static	DWORD MCI_Open(DWORD dwParam, LPM
 
 	    if (uDevType < MCI_DEVTYPE_FIRST ||
 		uDevType > MCI_DEVTYPE_LAST ||
-		!LoadStringW(WINMM_IData->hWinMM32Instance, uDevType, 
+		!LoadStringW(WINMM_IData.hWinMM32Instance, uDevType, 
                              strDevTyp, sizeof(strDevTyp) / sizeof(WCHAR))) {
 		dwRet = MCIERR_BAD_INTEGER;
 		goto errCleanUp;
@@ -1762,17 +1762,17 @@ static	DWORD MCI_Close(UINT16 wDevID, DW
     if (wDevID == MCI_ALL_DEVICE_ID) {
 	LPWINE_MCIDRIVER	next;
 
-	EnterCriticalSection(&WINMM_IData->cs);
+	EnterCriticalSection(&WINMM_IData.cs);
 	/* FIXME: shall I notify once after all is done, or for
 	 * each of the open drivers ? if the latest, which notif
 	 * to return when only one fails ?
 	 */
-	for (wmd = WINMM_IData->lpMciDrvs; wmd; ) {
+	for (wmd = WINMM_IData.lpMciDrvs; wmd; ) {
 	    next = wmd->lpNext;
 	    MCI_Close(wmd->wDeviceID, dwParam, lpParms);
 	    wmd = next;
 	}
-	LeaveCriticalSection(&WINMM_IData->cs);
+	LeaveCriticalSection(&WINMM_IData.cs);
 	return 0;
     }
 
@@ -1832,11 +1832,11 @@ static	DWORD MCI_SysInfo(UINT uDevID, DW
 	if (lpParms->wDeviceType < MCI_DEVTYPE_FIRST || lpParms->wDeviceType > MCI_DEVTYPE_LAST) {
 	    if (dwFlags & MCI_SYSINFO_OPEN) {
 		TRACE("MCI_SYSINFO_QUANTITY: # of open MCI drivers\n");
-		EnterCriticalSection(&WINMM_IData->cs);
-		for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
+		EnterCriticalSection(&WINMM_IData.cs);
+		for (wmd = WINMM_IData.lpMciDrvs; wmd; wmd = wmd->lpNext) {
 		    cnt++;
 		}
-		LeaveCriticalSection(&WINMM_IData->cs);
+		LeaveCriticalSection(&WINMM_IData.cs);
 	    } else {
 		TRACE("MCI_SYSINFO_QUANTITY: # of installed MCI drivers\n");
 		if (RegOpenKeyExW( HKEY_LOCAL_MACHINE, wszHklmMci,
@@ -1850,11 +1850,11 @@ static	DWORD MCI_SysInfo(UINT uDevID, DW
 	} else {
 	    if (dwFlags & MCI_SYSINFO_OPEN) {
 		TRACE("MCI_SYSINFO_QUANTITY: # of open MCI drivers of type %u\n", lpParms->wDeviceType);
-		EnterCriticalSection(&WINMM_IData->cs);
-		for (wmd = WINMM_IData->lpMciDrvs; wmd; wmd = wmd->lpNext) {
+		EnterCriticalSection(&WINMM_IData.cs);
+		for (wmd = WINMM_IData.lpMciDrvs; wmd; wmd = wmd->lpNext) {
 		    if (wmd->wType == lpParms->wDeviceType) cnt++;
 		}
-		LeaveCriticalSection(&WINMM_IData->cs);
+		LeaveCriticalSection(&WINMM_IData.cs);
 	    } else {
 		TRACE("MCI_SYSINFO_QUANTITY: # of installed MCI drivers of type %u\n", lpParms->wDeviceType);
 		FIXME("Don't know how to get # of MCI devices of a given type\n");
@@ -2135,7 +2135,7 @@ BOOL WINAPI mciGetErrorStringW(MCIERROR 
     if (lpstrBuffer != NULL && uLength > 0 &&
 	wError >= MCIERR_BASE && wError <= MCIERR_CUSTOM_DRIVER_BASE) {
 
-	if (LoadStringW(WINMM_IData->hWinMM32Instance,
+	if (LoadStringW(WINMM_IData.hWinMM32Instance,
 			wError, lpstrBuffer, uLength) > 0) {
 	    ret = TRUE;
 	}
@@ -2153,7 +2153,7 @@ BOOL WINAPI mciGetErrorStringA(MCIERROR 
     if (lpstrBuffer != NULL && uLength > 0 &&
 	dwError >= MCIERR_BASE && dwError <= MCIERR_CUSTOM_DRIVER_BASE) {
 
-	if (LoadStringA(WINMM_IData->hWinMM32Instance,
+	if (LoadStringA(WINMM_IData.hWinMM32Instance,
 			dwError, lpstrBuffer, uLength) > 0) {
 	    ret = TRUE;
 	}
Index: dlls/winmm/mmio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/mmio.c,v
retrieving revision 1.48
diff -u -p -r1.48 mmio.c
--- dlls/winmm/mmio.c	11 Mar 2005 12:50:27 -0000	1.48
+++ dlls/winmm/mmio.c	27 Apr 2005 05:55:41 -0000
@@ -440,12 +440,12 @@ LPWINE_MMIO	MMIO_Get(HMMIO h)
 {
     LPWINE_MMIO		wm = NULL;
 
-    EnterCriticalSection(&WINMM_IData->cs);
-    for (wm = WINMM_IData->lpMMIO; wm; wm = wm->lpNext) {
+    EnterCriticalSection(&WINMM_IData.cs);
+    for (wm = WINMM_IData.lpMMIO; wm; wm = wm->lpNext) {
 	if (wm->info.hmmio == h)
 	    break;
     }
-    LeaveCriticalSection(&WINMM_IData->cs);
+    LeaveCriticalSection(&WINMM_IData.cs);
     return wm;
 }
 
@@ -461,13 +461,13 @@ static	LPWINE_MMIO		MMIO_Create(void)
 
     wm = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MMIO));
     if (wm) {
-	EnterCriticalSection(&WINMM_IData->cs);
+	EnterCriticalSection(&WINMM_IData.cs);
         /* lookup next unallocated WORD handle, with a non NULL value */
 	while (++MMIO_counter == 0 || MMIO_Get((HMMIO)(ULONG_PTR)MMIO_counter));
 	wm->info.hmmio = (HMMIO)(ULONG_PTR)MMIO_counter;
-	wm->lpNext = WINMM_IData->lpMMIO;
-	WINMM_IData->lpMMIO = wm;
-	LeaveCriticalSection(&WINMM_IData->cs);
+	wm->lpNext = WINMM_IData.lpMMIO;
+	WINMM_IData.lpMMIO = wm;
+	LeaveCriticalSection(&WINMM_IData.cs);
     }
     return wm;
 }
@@ -481,9 +481,9 @@ static	BOOL		MMIO_Destroy(LPWINE_MMIO wm
 {
     LPWINE_MMIO*	m;
 
-    EnterCriticalSection(&WINMM_IData->cs);
+    EnterCriticalSection(&WINMM_IData.cs);
     /* search for the matching one... */
-    m = &(WINMM_IData->lpMMIO);
+    m = &(WINMM_IData.lpMMIO);
     while (*m && *m != wm) m = &(*m)->lpNext;
     /* ...and destroy */
     if (*m) {
@@ -491,7 +491,7 @@ static	BOOL		MMIO_Destroy(LPWINE_MMIO wm
 	HeapFree(GetProcessHeap(), 0, wm);
 	wm = NULL;
     }
-    LeaveCriticalSection(&WINMM_IData->cs);
+    LeaveCriticalSection(&WINMM_IData.cs);
     return wm ? FALSE : TRUE;
 }
 
Index: dlls/winmm/mmsystem.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/mmsystem.c,v
retrieving revision 1.114
diff -u -p -r1.114 mmsystem.c
--- dlls/winmm/mmsystem.c	21 Mar 2005 10:55:13 -0000	1.114
+++ dlls/winmm/mmsystem.c	27 Apr 2005 05:55:41 -0000
@@ -79,7 +79,7 @@ BOOL WINAPI MMSYSTEM_LibMain(DWORD fdwRe
             ERR("Could not load sibling WinMM.dll\n");
             return FALSE;
 	}
-	WINMM_IData->hWinMM16Instance = hinstDLL;
+	WINMM_IData.hWinMM16Instance = hinstDLL;
         /* hook in our 16 bit function pointers */
         pFnGetMMThread16    = WINMM_GetmmThread;
         pFnOpenDriver16     = DRIVER_OpenDriver16;
@@ -91,7 +91,7 @@ BOOL WINAPI MMSYSTEM_LibMain(DWORD fdwRe
         MMDRV_Init16();
 	break;
     case DLL_PROCESS_DETACH:
-	WINMM_IData->hWinMM16Instance = 0;
+	WINMM_IData.hWinMM16Instance = 0;
         pFnGetMMThread16    = NULL;
         pFnOpenDriver16     = NULL;
         pFnCloseDriver16    = NULL;
Index: dlls/winmm/playsound.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/playsound.c,v
retrieving revision 1.14
diff -u -p -r1.14 playsound.c
--- dlls/winmm/playsound.c	23 Dec 2004 20:31:56 -0000	1.14
+++ dlls/winmm/playsound.c	27 Apr 2005 05:55:41 -0000
@@ -194,11 +194,11 @@ static void     PlaySound_Free(WINE_PLAY
 {
     WINE_PLAYSOUND**    p;
 
-    EnterCriticalSection(&WINMM_IData->cs);
-    for (p = &WINMM_IData->lpPlaySound; *p && *p != wps; p = &((*p)->lpNext));
+    EnterCriticalSection(&WINMM_IData.cs);
+    for (p = &WINMM_IData.lpPlaySound; *p && *p != wps; p = &((*p)->lpNext));
     if (*p) *p = (*p)->lpNext;
-    if (WINMM_IData->lpPlaySound == NULL) SetEvent(WINMM_IData->psLastEvent);
-    LeaveCriticalSection(&WINMM_IData->cs);
+    if (WINMM_IData.lpPlaySound == NULL) SetEvent(WINMM_IData.psLastEvent);
+    LeaveCriticalSection(&WINMM_IData.cs);
     if (wps->bAlloc) HeapFree(GetProcessHeap(), 0, (void*)wps->pszSound);
     if (wps->hThread) CloseHandle(wps->hThread);
     HeapFree(GetProcessHeap(), 0, wps);
@@ -382,7 +382,7 @@ static DWORD WINAPI proc_PlaySound(LPVOI
 	mmioSeek(hmmio, mmckInfo.dwDataOffset, SEEK_SET);
 	while (left)
         {
-	    if (WaitForSingleObject(WINMM_IData->psStopEvent, 0) == WAIT_OBJECT_0)
+	    if (WaitForSingleObject(WINMM_IData.psStopEvent, 0) == WAIT_OBJECT_0)
             {
 		wps->bLoop = FALSE;
 		break;
@@ -430,7 +430,7 @@ static BOOL MULTIMEDIA_PlaySound(const v
     /* FIXME? I see no difference between SND_NOWAIT and SND_NOSTOP !
      * there could be one if several sounds can be played at once...
      */
-    if ((fdwSound & (SND_NOWAIT | SND_NOSTOP)) && WINMM_IData->lpPlaySound != NULL)
+    if ((fdwSound & (SND_NOWAIT | SND_NOSTOP)) && WINMM_IData.lpPlaySound != NULL)
 	return FALSE;
 
     /* alloc internal structure, if we need to play something */
@@ -440,27 +440,27 @@ static BOOL MULTIMEDIA_PlaySound(const v
             return FALSE;
     }
 
-    EnterCriticalSection(&WINMM_IData->cs);
+    EnterCriticalSection(&WINMM_IData.cs);
     /* since several threads can enter PlaySound in parallel, we're not
      * sure, at this point, that another thread didn't start a new playsound
      */
-    while (WINMM_IData->lpPlaySound != NULL)
+    while (WINMM_IData.lpPlaySound != NULL)
     {
-        ResetEvent(WINMM_IData->psLastEvent);
+        ResetEvent(WINMM_IData.psLastEvent);
         /* FIXME: doc says we have to stop all instances of pszSound if it's non
          * NULL... as of today, we stop all playing instances */
-        SetEvent(WINMM_IData->psStopEvent);
+        SetEvent(WINMM_IData.psStopEvent);
 
-        LeaveCriticalSection(&WINMM_IData->cs);
-        WaitForSingleObject(WINMM_IData->psLastEvent, INFINITE);
-        EnterCriticalSection(&WINMM_IData->cs);
+        LeaveCriticalSection(&WINMM_IData.cs);
+        WaitForSingleObject(WINMM_IData.psLastEvent, INFINITE);
+        EnterCriticalSection(&WINMM_IData.cs);
 
-        ResetEvent(WINMM_IData->psStopEvent);
+        ResetEvent(WINMM_IData.psStopEvent);
     }
 
-    if (wps) wps->lpNext = WINMM_IData->lpPlaySound;
-    WINMM_IData->lpPlaySound = wps;
-    LeaveCriticalSection(&WINMM_IData->cs);
+    if (wps) wps->lpNext = WINMM_IData.lpPlaySound;
+    WINMM_IData.lpPlaySound = wps;
+    LeaveCriticalSection(&WINMM_IData.cs);
 
     if (!pszSound || (fdwSound & SND_PURGE)) return TRUE;
 
Index: dlls/winmm/time.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/time.c,v
retrieving revision 1.31
diff -u -p -r1.31 time.c
--- dlls/winmm/time.c	23 Apr 2005 19:03:47 -0000	1.31
+++ dlls/winmm/time.c	27 Apr 2005 05:55:41 -0000
@@ -264,7 +264,7 @@ void	TIME_MMTimeStart(void)
 	TIME_TimersList = NULL;
         TIME_hWakeEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
         TIME_TimeToDie = FALSE;
-	TIME_hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, WINMM_IData, 0, NULL);
+	TIME_hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, &WINMM_IData, 0, NULL);
         SetThreadPriority(TIME_hMMTimer, THREAD_PRIORITY_TIME_CRITICAL);
     }
 }
@@ -335,7 +335,7 @@ WORD	TIME_SetEventInternal(UINT wDelay, 
     lpNewTimer->dwUser = dwUser;
     lpNewTimer->wFlags = wFlags;
 
-    EnterCriticalSection(&WINMM_IData->cs);
+    EnterCriticalSection(&WINMM_IData.cs);
 
     if ((wFlags & TIME_KILL_SYNCHRONOUS) && !TIME_hKillEvent)
         TIME_hKillEvent = CreateEventW(NULL, TRUE, TRUE, NULL);
@@ -348,7 +348,7 @@ WORD	TIME_SetEventInternal(UINT wDelay, 
     TIME_TimersList = lpNewTimer;
     lpNewTimer->wTimerID = wNewID + 1;
 
-    LeaveCriticalSection(&WINMM_IData->cs);
+    LeaveCriticalSection(&WINMM_IData.cs);
 
     /* Wake the service thread in case there is work to be done */
     SetEvent(TIME_hWakeEvent);
@@ -379,7 +379,7 @@ MMRESULT WINAPI timeKillEvent(UINT wID)
     LPWINE_TIMERENTRY   lpSelf = NULL, *lpTimer;
 
     TRACE("(%u)\n", wID);
-    EnterCriticalSection(&WINMM_IData->cs);
+    EnterCriticalSection(&WINMM_IData.cs);
     /* remove WINE_TIMERENTRY from list */
     for (lpTimer = &TIME_TimersList; *lpTimer; lpTimer = &(*lpTimer)->lpNext) {
 	if (wID == (*lpTimer)->wTimerID) {
@@ -389,7 +389,7 @@ MMRESULT WINAPI timeKillEvent(UINT wID)
 	    break;
 	}
     }
-    LeaveCriticalSection(&WINMM_IData->cs);
+    LeaveCriticalSection(&WINMM_IData.cs);
 
     if (!lpSelf)
     {
Index: dlls/winmm/winemm.h
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winemm.h,v
retrieving revision 1.62
diff -u -p -r1.62 winemm.h
--- dlls/winmm/winemm.h	17 Mar 2005 10:25:25 -0000	1.62
+++ dlls/winmm/winemm.h	27 Apr 2005 05:55:41 -0000
@@ -291,7 +291,7 @@ void    	TIME_MMTimeStart(void);
 void		TIME_MMTimeStop(void);
 
 /* Global variables */
-extern LPWINE_MM_IDATA  WINMM_IData;
+extern WINE_MM_IDATA  WINMM_IData;
 
 /* pointers to 16 bit functions (if sibling MMSYSTEM.DLL is loaded
  * NULL otherwise
Index: dlls/winmm/winmm.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winmm.c,v
retrieving revision 1.52
diff -u -p -r1.52 winmm.c
--- dlls/winmm/winmm.c	24 Mar 2005 21:01:35 -0000	1.52
+++ dlls/winmm/winmm.c	27 Apr 2005 05:55:42 -0000
@@ -65,23 +65,21 @@ void    (WINAPI *pFnRestoreThunkLock)(DW
  *                   G L O B A L   S E T T I N G S
  * ========================================================================*/
 
-LPWINE_MM_IDATA		WINMM_IData /* = NULL */;
+WINE_MM_IDATA WINMM_IData;
 
 /**************************************************************************
  * 			WINMM_CreateIData			[internal]
  */
 static	BOOL	WINMM_CreateIData(HINSTANCE hInstDLL)
 {
-    WINMM_IData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MM_IDATA));
+    memset( &WINMM_IData, 0, sizeof WINMM_IData );
 
-    if (!WINMM_IData)
-	return FALSE;
-    WINMM_IData->hWinMM32Instance = hInstDLL;
-    InitializeCriticalSection(&WINMM_IData->cs);
-    WINMM_IData->cs.DebugInfo->Spare[1] = (DWORD)"WINMM_IData";
-    WINMM_IData->psStopEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
-    WINMM_IData->psLastEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
-    TRACE("Created IData (%p)\n", WINMM_IData);
+    WINMM_IData.hWinMM32Instance = hInstDLL;
+    InitializeCriticalSection(&WINMM_IData.cs);
+    WINMM_IData.cs.DebugInfo->Spare[1] = (DWORD)"WINMM_IData";
+    WINMM_IData.psStopEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
+    WINMM_IData.psLastEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
+    TRACE("Initialized IData (%p)\n", &WINMM_IData);
     return TRUE;
 }
 
@@ -90,17 +88,13 @@ static	BOOL	WINMM_CreateIData(HINSTANCE 
  */
 static	void WINMM_DeleteIData(void)
 {
-    if (WINMM_IData) {
-	TIME_MMTimeStop();
+    TIME_MMTimeStop();
 
-	/* FIXME: should also free content and resources allocated
-	 * inside WINMM_IData */
-        CloseHandle(WINMM_IData->psStopEvent);
-        CloseHandle(WINMM_IData->psLastEvent);
-        DeleteCriticalSection(&WINMM_IData->cs);
-        HeapFree(GetProcessHeap(), 0, WINMM_IData);
-        WINMM_IData = NULL;
-    }
+    /* FIXME: should also free content and resources allocated
+     * inside WINMM_IData */
+    CloseHandle(WINMM_IData.psStopEvent);
+    CloseHandle(WINMM_IData.psLastEvent);
+    DeleteCriticalSection(&WINMM_IData.cs);
 }
 
 /******************************************************************
@@ -863,7 +857,7 @@ UINT WINAPI midiOutGetErrorTextW(UINT uE
 		* a warning for the test was always true */
 	       (/*uError >= MMSYSERR_BASE && */ uError <= MMSYSERR_LASTERROR) ||
 	       (uError >= MIDIERR_BASE  && uError <= MIDIERR_LASTERROR)) {
-	if (LoadStringW(WINMM_IData->hWinMM32Instance,
+	if (LoadStringW(WINMM_IData.hWinMM32Instance,
 			uError, lpText, uSize) > 0) {
 	    ret = MMSYSERR_NOERROR;
 	}
@@ -2173,7 +2167,7 @@ UINT WINAPI waveOutGetErrorTextW(UINT uE
 		* a warning for the test was always true */
 	       (/*uError >= MMSYSERR_BASE && */ uError <= MMSYSERR_LASTERROR) ||
 	       (uError >= WAVERR_BASE  && uError <= WAVERR_LASTERROR)) {
-	if (LoadStringW(WINMM_IData->hWinMM32Instance,
+	if (LoadStringW(WINMM_IData.hWinMM32Instance,
 			uError, lpText, uSize) > 0) {
 	    ret = MMSYSERR_NOERROR;
 	}


More information about the wine-patches mailing list