[PATCH] [MMSystem.drv]: always create a thunk for MMIO objects

Eric Pouech eric.pouech at orange.fr
Wed Jun 23 15:11:51 CDT 2010


partial fix for #23253

A+
---

 dlls/mmsystem.dll16/mmio16.c |   23 ++++++++++++++---------
 1 files changed, 14 insertions(+), 9 deletions(-)


diff --git a/dlls/mmsystem.dll16/mmio16.c b/dlls/mmsystem.dll16/mmio16.c
index cc13583..ff55ce9 100644
--- a/dlls/mmsystem.dll16/mmio16.c
+++ b/dlls/mmsystem.dll16/mmio16.c
@@ -248,7 +248,7 @@ HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16,
 	memset(&mmioinfo, 0, sizeof(mmioinfo));
 
         EnterCriticalSection(&mmio_cs);
-        if (lpmmioinfo16->pIOProc && !(thunk = MMIO_AddThunk(lpmmioinfo16->pIOProc, lpmmioinfo16->pchBuffer)))
+        if (!(thunk = MMIO_AddThunk(lpmmioinfo16->pIOProc, lpmmioinfo16->pchBuffer)))
         {
             LeaveCriticalSection(&mmio_cs);
             return 0;
@@ -256,7 +256,7 @@ HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16,
 
 	mmioinfo.dwFlags     = lpmmioinfo16->dwFlags;
 	mmioinfo.fccIOProc   = lpmmioinfo16->fccIOProc;
-	mmioinfo.pIOProc     = (LPMMIOPROC)thunk;
+	mmioinfo.pIOProc     = lpmmioinfo16->pIOProc ? (LPMMIOPROC)thunk : 0;
 	mmioinfo.cchBuffer   = lpmmioinfo16->cchBuffer;
 	mmioinfo.pchBuffer   = MapSL((DWORD)lpmmioinfo16->pchBuffer);
         mmioinfo.adwInfo[0]  = lpmmioinfo16->adwInfo[0];
@@ -267,14 +267,19 @@ HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16,
 	mmioinfo.adwInfo[2]  = lpmmioinfo16->adwInfo[2];
 
 	ret = mmioOpenA(szFileName, &mmioinfo, dwOpenFlags);
-        if (thunk)
+        if (!ret || (dwOpenFlags & (MMIO_PARSE|MMIO_EXIST)))
         {
-            if (!ret || (dwOpenFlags & (MMIO_PARSE|MMIO_EXIST)))
-            {
-                thunk->pfn16 = NULL;
-                thunk->hMmio = NULL;
-            }
-            else thunk->hMmio = ret;
+            thunk->pfn16 = NULL;
+            thunk->hMmio = NULL;
+        }
+        else thunk->hMmio = ret;
+        if (ret && (dwOpenFlags & MMIO_ALLOCBUF))
+        {
+            MMIOINFO    m;
+            if (lpmmioinfo16->pchBuffer) FIXME("ooch\n");
+            /* FIXME: check whether mmioOpen should set pchBuffer */
+            mmioGetInfo(ret, &m, 0);
+            thunk->segbuffer = MapLS(m.pchBuffer);
         }
         LeaveCriticalSection(&mmio_cs);
 






More information about the wine-patches mailing list