From 812b4f46e992e6e62b6ac8e8f0f96ca18ad417c0 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Wed, 30 Apr 2003 17:28:45 +0000
Subject: [PATCH] Avoid calling Win32 resource functions on 16-bit modules.

---
 dlls/winmm/mci.c      | 36 +++++++++++++++---------------------
 dlls/winmm/mmsystem.c | 31 ++++++++++++++++++++++---------
 dlls/winmm/winemm.h   |  1 +
 3 files changed, 38 insertions(+), 30 deletions(-)

diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c
index ca2009c0154..092ee103c2b 100644
--- a/dlls/winmm/mci.c
+++ b/dlls/winmm/mci.c
@@ -198,13 +198,13 @@ static	DWORD	MCI_GetDevTypeFromFileName(LPCSTR fileName, LPSTR buf, UINT len)
 #define MCI_COMMAND_TABLE_NOT_LOADED	0xFFFE
 
 typedef struct tagWINE_MCICMDTABLE {
-    HANDLE		hMem;
     UINT		uDevType;
     LPCSTR		lpTable;
     UINT		nVerbs;		/* number of verbs in command table */
     LPCSTR*		aVerbs;		/* array of verbs to speed up the verb look up process */
 } WINE_MCICMDTABLE, *LPWINE_MCICMDTABLE;
-WINE_MCICMDTABLE	S_MciCmdTable[MAX_MCICMDTABLE];
+
+static WINE_MCICMDTABLE S_MciCmdTable[MAX_MCICMDTABLE];
 
 /**************************************************************************
  * 				MCI_IsCommandTableValid		[internal]
@@ -217,10 +217,10 @@ static	BOOL		MCI_IsCommandTableValid(UINT uTbl)
     int		idx = 0;
     BOOL	inCst = FALSE;
 
-    TRACE("Dumping cmdTbl=%d [hMem=%p devType=%d]\n",
-	  uTbl, S_MciCmdTable[uTbl].hMem, S_MciCmdTable[uTbl].uDevType);
+    TRACE("Dumping cmdTbl=%d [lpTable=%p devType=%d]\n",
+	  uTbl, S_MciCmdTable[uTbl].lpTable, S_MciCmdTable[uTbl].uDevType);
 
-    if (uTbl >= MAX_MCICMDTABLE || !S_MciCmdTable[uTbl].hMem || !S_MciCmdTable[uTbl].lpTable)
+    if (uTbl >= MAX_MCICMDTABLE || !S_MciCmdTable[uTbl].lpTable)
 	return FALSE;
 
     lmem = S_MciCmdTable[uTbl].lpTable;
@@ -281,7 +281,6 @@ static	BOOL		MCI_DumpCommandTable(UINT uTbl)
     return TRUE;
 }
 
-static	UINT		MCI_SetCommandTable(HANDLE hMem, UINT uDevType);
 
 /**************************************************************************
  * 				MCI_GetCommandTable		[internal]
@@ -294,7 +293,7 @@ static	UINT		MCI_GetCommandTable(UINT uDevType)
 
     /* first look up existing for existing devType */
     for (uTbl = 0; uTbl < MAX_MCICMDTABLE; uTbl++) {
-	if (S_MciCmdTable[uTbl].hMem && S_MciCmdTable[uTbl].uDevType == uDevType)
+	if (S_MciCmdTable[uTbl].lpTable && S_MciCmdTable[uTbl].uDevType == uDevType)
 	    return uTbl;
     }
 
@@ -313,7 +312,7 @@ static	UINT		MCI_GetCommandTable(UINT uDevType)
 
 	if (hRsrc) hMem = LoadResource(WINMM_IData->hWinMM32Instance, hRsrc);
 	if (hMem) {
-	    uTbl = MCI_SetCommandTable(hMem, uDevType);
+	    uTbl = MCI_SetCommandTable(LockResource(hMem), uDevType);
 	} else {
 	    WARN("No command table found in resource %p[%s]\n",
 		 WINMM_IData->hWinMM32Instance, str);
@@ -326,7 +325,7 @@ static	UINT		MCI_GetCommandTable(UINT uDevType)
 /**************************************************************************
  * 				MCI_SetCommandTable		[internal]
  */
-static	UINT		MCI_SetCommandTable(HANDLE hMem, UINT uDevType)
+UINT MCI_SetCommandTable(void *table, UINT uDevType)
 {
     int		        uTbl;
     static	BOOL	bInitDone = FALSE;
@@ -338,21 +337,17 @@ static	UINT		MCI_SetCommandTable(HANDLE hMem, UINT uDevType)
      */
     if (!bInitDone) {
 	bInitDone = TRUE;
-	for (uTbl = 0; uTbl < MAX_MCICMDTABLE; uTbl++) {
-	    S_MciCmdTable[uTbl].hMem = 0;
-	}
 	MCI_GetCommandTable(0);
     }
 
     for (uTbl = 0; uTbl < MAX_MCICMDTABLE; uTbl++) {
-	if (S_MciCmdTable[uTbl].hMem == 0) {
+	if (!S_MciCmdTable[uTbl].lpTable) {
 	    LPCSTR 	lmem, str;
 	    WORD	eid;
 	    WORD	count;
 
-	    S_MciCmdTable[uTbl].hMem = hMem;
 	    S_MciCmdTable[uTbl].uDevType = uDevType;
-	    S_MciCmdTable[uTbl].lpTable = LockResource(hMem);
+	    S_MciCmdTable[uTbl].lpTable = table;
 
 	    if (TRACE_ON(mci)) {
 		MCI_DumpCommandTable(uTbl);
@@ -396,11 +391,10 @@ static	UINT		MCI_SetCommandTable(HANDLE hMem, UINT uDevType)
  */
 static	BOOL	MCI_DeleteCommandTable(UINT uTbl)
 {
-    if (uTbl >= MAX_MCICMDTABLE || !S_MciCmdTable[uTbl].hMem)
+    if (uTbl >= MAX_MCICMDTABLE || !S_MciCmdTable[uTbl].lpTable)
 	return FALSE;
 
-    FreeResource(S_MciCmdTable[uTbl].hMem);
-    S_MciCmdTable[uTbl].hMem = 0;
+    S_MciCmdTable[uTbl].lpTable = NULL;
     if (S_MciCmdTable[uTbl].aVerbs) {
 	HeapFree(GetProcessHeap(), 0, S_MciCmdTable[uTbl].aVerbs);
 	S_MciCmdTable[uTbl].aVerbs = 0;
@@ -584,7 +578,7 @@ static	LPCSTR		MCI_FindCommand(UINT uTbl, LPCSTR verb)
 {
     UINT	idx;
 
-    if (uTbl >= MAX_MCICMDTABLE || S_MciCmdTable[uTbl].hMem == 0)
+    if (uTbl >= MAX_MCICMDTABLE || !S_MciCmdTable[uTbl].lpTable)
 	return NULL;
 
     /* another improvement would be to have the aVerbs array sorted,
@@ -1123,10 +1117,10 @@ UINT WINAPI mciLoadCommandResource(HINSTANCE hInst, LPCWSTR resNameW, UINT type)
 	}
 #endif
     }
-    if (!(hRsrc = FindResourceW(hInst, resNameW, (LPCWSTR)RT_RCDATAA))) {
+    if (!(hRsrc = FindResourceW(hInst, resNameW, RT_RCDATAW))) {
 	WARN("No command table found in resource\n");
     } else if ((hMem = LoadResource(hInst, hRsrc))) {
-	ret = MCI_SetCommandTable(hMem, type);
+	ret = MCI_SetCommandTable(LockResource(hMem), type);
     } else {
 	WARN("Couldn't load resource.\n");
     }
diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c
index 671664c72a6..0ef0ca35626 100644
--- a/dlls/winmm/mmsystem.c
+++ b/dlls/winmm/mmsystem.c
@@ -53,8 +53,6 @@ static LRESULT          DRIVER_CloseDriver16(HDRVR16, LPARAM, LPARAM);
 static LRESULT          DRIVER_SendMessage16(HDRVR16, UINT, LPARAM, LPARAM);
 static LRESULT          MMIO_Callback16(SEGPTR, LPMMIOINFO, UINT, LPARAM, LPARAM);
 
-#define HMODULE_32(h16) ((HMODULE)(ULONG_PTR)(h16))
-#define HINSTANCE_32(h16) ((HMODULE)(ULONG_PTR)(h16))
 
 /* ###################################################
  * #                  LIBRARY                        #
@@ -130,8 +128,20 @@ BOOL16 WINAPI PlaySound16(LPCSTR pszSound, HMODULE16 hmod, DWORD fdwSound)
     BOOL16	retv;
     DWORD	lc;
 
+    if ((fdwSound & SND_RESOURCE) == SND_RESOURCE)
+    {
+        HGLOBAL16 handle;
+        HRSRC16 res;
+
+        if (!(res = FindResource16( hmod, pszSound, "WAVE" ))) return FALSE;
+        if (!(handle = LoadResource16( hmod, res ))) return FALSE;
+        pszSound = LockResource16(handle);
+        fdwSound = (fdwSound & ~SND_RESOURCE) | SND_MEMORY;
+        /* FIXME: FreeResource16 */
+    }
+
     ReleaseThunkLock(&lc);
-    retv = PlaySoundA(pszSound, HMODULE_32(hmod), fdwSound);
+    retv = PlaySoundA(pszSound, 0, fdwSound);
     RestoreThunkLock(lc);
 
     return retv;
@@ -2550,12 +2560,15 @@ DWORD WINAPI mciSendString16(LPCSTR lpstrCommand, LPSTR lpstrRet,
  */
 UINT16 WINAPI mciLoadCommandResource16(HINSTANCE16 hInst, LPCSTR resname, UINT16 type)
 {
-    UNICODE_STRING ptr;
-    UINT          ret;
-    RtlCreateUnicodeStringFromAsciiz(&ptr, resname);
-    ret = mciLoadCommandResource(HINSTANCE_32(hInst), ptr.Buffer, type);
-    RtlFreeUnicodeString(&ptr);
-    return ret;
+    HRSRC16 res;
+    HGLOBAL16 handle;
+    void *ptr;
+
+    if (!(res = FindResource16( hInst, resname, RT_RCDATAA))) return MCI_NO_COMMAND_TABLE;
+    if (!(handle = LoadResource16( hInst, res ))) return MCI_NO_COMMAND_TABLE;
+    ptr = LockResource16(handle);
+    return MCI_SetCommandTable(ptr, type);
+    /* FIXME: FreeResource */
 }
 
 /**************************************************************************
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h
index be1ffbe3896..9a6739d7801 100644
--- a/dlls/winmm/winemm.h
+++ b/dlls/winmm/winemm.h
@@ -258,6 +258,7 @@ LRESULT		MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2);
 DWORD		MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2, BOOL bFrom32);
 DWORD		MCI_SendCommandFrom32(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
 DWORD		MCI_SendCommandFrom16(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
+UINT		MCI_SetCommandTable(void *table, UINT uDevType);
 
 BOOL            WINMM_CheckForMMSystem(void);
 
-- 
GitLab