[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-patches
Subject:    mmio patch
From:       Bradley Baetz <bbaetz () student ! usyd ! edu ! au>
Date:       1999-12-30 9:28:55
[Download RAW message or body]

Thanks to Eric Pouech for point out the problem, and helping me with the
patch.

Changelog:
	* Convert mmio to allow the use of 32 bit mmio procedures

Thanks,


Bradley
["mmio.diff" (application/octet-stream)]

Index: dlls/winmm/mmio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/mmio.c,v
retrieving revision 1.4
diff -u -w -r1.4 mmio.c
--- dlls/winmm/mmio.c	1999/12/08 03:26:31	1.4
+++ dlls/winmm/mmio.c	1999/12/30 10:11:17
@@ -21,7 +21,47 @@
 
 DEFAULT_DEBUG_CHANNEL(mmio)
 
+LPMMIOPROC16 MMIO_InstallIOProc(FOURCC, LPMMIOPROC16, DWORD, BOOL);
+
+/******************************************************************
+ * MMIO_infoMap16To32 [INTERNAL]
+ */
+
+void MMIO_infoMap16To32(LPMMIOINFO lpmminfo, const LPMMIOINFO16 lpmminfo16) {
+	lpmminfo->dwFlags = lpmminfo16->dwFlags;
+	lpmminfo->fccIOProc = lpmminfo16->fccIOProc;
+	lpmminfo->pIOProc = (LPMMIOPROC)lpmminfo16->pIOProc;
+	lpmminfo->wErrorRet = lpmminfo16->wErrorRet;
+	/* FIXME: Problems if we start using htask? */
+	lpmminfo->htask = lpmminfo16->htask;
+	lpmminfo->cchBuffer = lpmminfo16->cchBuffer;
+	lpmminfo->pchBuffer = PTR_SEG_TO_LIN(lpmminfo16->pchBuffer);
+	lpmminfo->pchNext = PTR_SEG_TO_LIN(lpmminfo16->pchNext);
+	lpmminfo->pchEndRead = PTR_SEG_TO_LIN(lpmminfo16->pchEndRead);
+	lpmminfo->pchEndWrite = PTR_SEG_TO_LIN(lpmminfo16->pchEndWrite);
+	lpmminfo->lBufOffset = lpmminfo16->lBufOffset;
+	lpmminfo->lDiskOffset = lpmminfo16->lDiskOffset;
+	memcpy(lpmminfo->adwInfo,lpmminfo16->adwInfo,sizeof(lpmminfo->adwInfo));
+	lpmminfo->dwReserved1 = lpmminfo16->dwReserved1;
+	lpmminfo->dwReserved2 = lpmminfo16->dwReserved2;
+	lpmminfo->hmmio = lpmminfo16->hmmio;
+}
+
 /**************************************************************************
+ * MMIO_infoUnmap16To32 [INTERNAL]
+ *
+ * NOTE: This function only changes paramaters which can be changed by the
+ * MMIO proc (according to MSDN), as well as the dwReserved values.
+ */
+void MMIO_infoUnmap16To32(LPMMIOINFO16 lpmminfo16, const LPMMIOINFO lpmminfo) {
+	lpmminfo16->lBufOffset = lpmminfo->lBufOffset;
+	lpmminfo16->lDiskOffset = lpmminfo->lDiskOffset;
+	memcpy(lpmminfo16->adwInfo,lpmminfo->adwInfo,sizeof(lpmminfo16->adwInfo));
+	lpmminfo16->dwReserved1 = lpmminfo->dwReserved1;
+	lpmminfo16->dwReserved2 = lpmminfo->dwReserved2;
+}
+
+/**************************************************************************
  *               mmioDosIOProc           [internal]
  */
 static LRESULT mmioDosIOProc(LPMMIOINFO16 lpmmioinfo, UINT16 uMessage, LPARAM \
lParam1, LPARAM lParam2) { @@ -298,12 +338,12 @@
 /**************************************************************************
  * 		MMIO_Open      		[internal]
  */
-static HMMIO16 MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlags, \
int use16) +static HMMIO16 MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD \
dwOpenFlags, BOOL b32bit)  {
 	LPMMIOINFO16 lpmminfo;
 	HMMIO16 hmmio;
 	
-	TRACE("('%s', %08lX);\n", szFileName, dwOpenFlags);
+	TRACE("('%s', %p, %08lX, %d);\n", szFileName, refmminfo, dwOpenFlags, \
b32bit?32:16);  
 	if (dwOpenFlags & MMIO_PARSE) {
 		char	buffer[MAX_PATH];
@@ -328,7 +368,7 @@
 		lpmminfo->fccIOProc = FOURCC_DOS;
 		lpmminfo->pIOProc = (LPMMIOPROC16) mmioDosIOProc;
  		} else {
-			lpmminfo->pIOProc = mmioInstallIOProc16(lpmminfo->fccIOProc, NULL, \
MMIO_FINDPROC); +			lpmminfo->pIOProc = MMIO_InstallIOProc(lpmminfo->fccIOProc, NULL, \
MMIO_FINDPROC, b32bit);  }
 	}
 
@@ -336,7 +376,7 @@
 	else if (refmminfo->pIOProc == NULL) {
 
 		lpmminfo->fccIOProc = refmminfo->fccIOProc;
-		lpmminfo->pIOProc = mmioInstallIOProc16(refmminfo->fccIOProc, NULL, \
MMIO_FINDPROC); +		lpmminfo->pIOProc = MMIO_InstallIOProc(refmminfo->fccIOProc, NULL, \
MMIO_FINDPROC, b32bit);  
 	} 
 	/* if IO proc specified, use it and specified four character code */
@@ -362,7 +402,7 @@
 	lpmminfo->hmmio = hmmio;
 	
 	/* call IO proc to actually open file */
-	refmminfo->wErrorRet = (UINT16) mmioSendMessage(hmmio, MMIOM_OPEN, (LPARAM) \
szFileName, (LPARAM) use16); +	refmminfo->wErrorRet = (UINT16) mmioSendMessage(hmmio, \
MMIOM_OPEN, (LPARAM) szFileName, (LPARAM) !b32bit);  
 	GlobalUnlock16(hmmio);
 	
@@ -396,7 +436,7 @@
 	HMMIO 	ret;
 	
 	if (lpmmioinfo) {
-		ret = MMIO_Open(szFileName, lpmmioinfo, dwOpenFlags, FALSE);
+		ret = MMIO_Open(szFileName, lpmmioinfo, dwOpenFlags, TRUE);
 	} else {
 	   MMIOINFO	mmioinfo;
 
@@ -405,7 +445,7 @@
 	   mmioinfo.pchBuffer = NULL;
 	   mmioinfo.cchBuffer = 0;
 
-	   ret = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, FALSE);
+		ret = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, TRUE);
 	}
 	return ret;
 }
@@ -420,15 +460,19 @@
 	MMIOINFO	mmio;
 
 	if (lpmmioinfo) {
-		mmio.fccIOProc = lpmmioinfo->fccIOProc;
-		mmio.pIOProc = (LPMMIOPROC)lpmmioinfo->pIOProc;
-		mmio.pchBuffer = PTR_SEG_TO_LIN(lpmmioinfo->pchBuffer);
-		mmio.cchBuffer = lpmmioinfo->cchBuffer;
-		mmio.adwInfo[0] = lpmmioinfo->adwInfo[0];
+		MMIO_infoMap16To32(&mmio,lpmmioinfo);
 		ret = MMIO_Open(szFileName, &mmio, dwOpenFlags, FALSE);
+		MMIO_infoUnmap16To32(lpmmioinfo,&mmio);
+		/* Copy additional things changed by MMIO_Open */
+		lpmmioinfo->fccIOProc = mmio.fccIOProc;
+		lpmmioinfo->pIOProc = (LPMMIOPROC16)mmio.pIOProc;
 		lpmmioinfo->wErrorRet = mmio.wErrorRet;
 	} else {
-	        return mmioOpenA(szFileName, NULL, dwOpenFlags);
+		mmio.fccIOProc = 0;
+		mmio.pIOProc = NULL;
+		mmio.pchBuffer = NULL;
+		mmio.cchBuffer = 0;
+		ret = MMIO_Open(szFileName, &mmio, dwOpenFlags, FALSE);
 	}
 	return ret;
 }
@@ -663,22 +707,7 @@
 	ret = mmioGetInfo16(hmmio,&mmioinfo,uFlags);
 	if (!ret)
 		return 0;
-	lpmmioinfo->dwFlags	= lpmminfo->dwFlags;
-	lpmmioinfo->fccIOProc	= lpmminfo->fccIOProc;
-	lpmmioinfo->pIOProc	= (LPMMIOPROC)lpmminfo->pIOProc;
-	lpmmioinfo->wErrorRet	= lpmminfo->wErrorRet;
-	lpmmioinfo->htask	= lpmminfo->htask;
-	lpmmioinfo->cchBuffer	= lpmminfo->cchBuffer;
-	lpmmioinfo->pchBuffer	= lpmminfo->pchBuffer;
-	lpmmioinfo->pchNext	= lpmminfo->pchNext;
-	lpmmioinfo->pchEndRead	= lpmminfo->pchEndRead;
-	lpmmioinfo->pchEndWrite	= lpmminfo->pchEndWrite;
-	lpmmioinfo->lBufOffset	= lpmminfo->lBufOffset;
-	lpmmioinfo->lDiskOffset	= lpmminfo->lDiskOffset;
-	memcpy(lpmmioinfo->adwInfo,lpmminfo->adwInfo,sizeof(lpmminfo->adwInfo));
-	lpmmioinfo->dwReserved1	= lpmminfo->dwReserved1;
-	lpmmioinfo->dwReserved2	= lpmminfo->dwReserved2;
-	lpmmioinfo->hmmio	= lpmminfo->hmmio;
+	MMIO_infoMap16To32(lpmmioinfo, lpmminfo);
 	return 0;
 }
 
@@ -706,8 +735,7 @@
 	TRACE("mmioSetInfo\n");
 	lpmminfo = (LPMMIOINFO16)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
-	lpmminfo->pchNext	= lpmmioinfo->pchNext;
-	lpmminfo->pchEndRead	= lpmmioinfo->pchEndRead;
+	lpmminfo->pchNext = (HPSTR)(lpmminfo->pchBuffer + (lpmmioinfo->pchNext - \
lpmmioinfo->pchBuffer));  GlobalUnlock16(hmmio);
 	return 0;
 }
@@ -831,23 +859,29 @@
 UINT WINAPI mmioAdvance(HMMIO hmmio,MMIOINFO*lpmmioinfo,UINT uFlags)
 {
 	LPMMIOINFO16	lpmminfo;
-	TRACE("mmioAdvance\n");
+	DWORD count;
+
+	TRACE("hmmio=%04X, lpmmioinfo=%p, uFlags=%04X\n", hmmio, lpmmioinfo, uFlags);
 	lpmminfo = (LPMMIOINFO16)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	if (!lpmminfo->cchBuffer) {
 		GlobalUnlock16(hmmio);
 		return MMIOERR_UNBUFFERED;
 	}
-	lpmminfo->pchNext = lpmmioinfo->pchNext;
+	lpmminfo->pchNext += (lpmmioinfo->pchNext - lpmminfo->pchBuffer);
 	if (mmioFlush(hmmio, MMIO_EMPTYBUF)) {
 		GlobalUnlock16(hmmio);
 		return MMIOERR_CANNOTWRITE;
 	}
-	if (uFlags == MMIO_READ)
-	        lpmmioinfo->pchEndRead = lpmmioinfo->pchBuffer +
-	            mmioSendMessage(hmmio, MMIOM_READ,
+	if (uFlags == MMIO_READ) {
+		count = mmioSendMessage(hmmio, MMIOM_READ,
 	                (LPARAM) lpmmioinfo->pchBuffer,
 	                (LPARAM) lpmmioinfo->cchBuffer);
+		lpmmioinfo->pchEndRead = lpmmioinfo->pchBuffer + count;
+		lpmminfo->pchEndRead = lpmminfo->pchBuffer + count;
+		/* Manually update pchNext for the 16 bit struct */
+		lpmminfo->pchNext += count;
+	}
 #if 0   /* mmioFlush already did the writing */
 	if (uFlags == MMIO_WRITE)
 	            mmioSendMessage(hmmio, MMIOM_WRITE,
@@ -940,11 +974,6 @@
 	return mmioFOURCC(cc[0],cc[1],cc[2],cc[3]);
 }
 
-/**************************************************************************
-* 				mmioInstallIOProc16	[MMSYSTEM.1221]
-*/
-
-
 /* maximum number of I/O procedures which can be installed */
 
 struct IOProcList
@@ -952,25 +981,48 @@
   struct IOProcList *pNext;      /* Next item in linked list */
   FOURCC            fourCC;     /* four-character code identifying IOProc */
   LPMMIOPROC16      pIOProc;    /* pointer to IProc */
+  BOOL              b32bit;       /* 32 bit IO proc? */
 };
 
 /* This array will be the entire list for most apps */
 
 static struct IOProcList defaultProcs[] = {
-  { &defaultProcs[1], (FOURCC) FOURCC_DOS,(LPMMIOPROC16) mmioDosIOProc },
-  { NULL, (FOURCC) FOURCC_MEM,(LPMMIOPROC16) mmioMemIOProc },
+  { &defaultProcs[1], (FOURCC) FOURCC_DOS,(LPMMIOPROC16) mmioDosIOProc, FALSE },
+  { NULL, (FOURCC) FOURCC_MEM,(LPMMIOPROC16) mmioMemIOProc, FALSE },
 };
 
 static struct IOProcList *pIOProcListAnchor = &defaultProcs[0];
+
+/****************************************************************
+ *       MMIO_FindProcNode [INTERNAL]
+ *
+ * Finds the ProcList node associated with a given FOURCC code.
+ */
+struct IOProcList *MMIO_FindProcNode(FOURCC fccIOProc) {
+	struct IOProcList *pListNode;
 
-LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC fccIOProc, 
-                                        LPMMIOPROC16 pIOProc, DWORD dwFlags)
+	for (pListNode = pIOProcListAnchor; pListNode; pListNode=pListNode->pNext)
+		{
+			if (pListNode->fourCC == fccIOProc)
 {
+					return pListNode;
+		        };
+		};
+	return NULL;
+}
+
+/****************************************************************
+ *       MMIO_InstallIOProc [INTERNAL]
+ */
+
+LPMMIOPROC16 MMIO_InstallIOProc(FOURCC fccIOProc, LPMMIOPROC16 pIOProc,
+                                        DWORD dwFlags, BOOL b32bit)
+{
 	LPMMIOPROC16        lpProc = NULL;
         struct IOProcList  *pListNode;
 
-	TRACE("(%ld, %p, %08lX)\n",
-				 fccIOProc, pIOProc, dwFlags);
+	TRACE("(%ld, %p, %08lX, %i)\n",
+				 fccIOProc, pIOProc, dwFlags, (b32bit?32:16));
 
 	if (dwFlags & MMIO_GLOBALPROC) {
 		FIXME(" global procedures not implemented\n");
@@ -991,6 +1043,7 @@
 	            /* Fill in this node */
 	            pListNode->fourCC = fccIOProc;
 	            pListNode->pIOProc = pIOProc;
+				pListNode->b32bit = b32bit;
 	    
 	            /* Stick it on the end of the list */
 	            pListEnd->pNext = pListNode;
@@ -1024,15 +1077,10 @@
 	          break;
 	    
 		case MMIO_FINDPROC:
-		      /* Iterate through the list looking for this proc identified by fourCC */
-		      for (pListNode = pIOProcListAnchor; pListNode; pListNode=pListNode->pNext)
-		      {
-		        if (pListNode->fourCC == fccIOProc)
-		        {
+			  pListNode = MMIO_FindProcNode(fccIOProc);
+			  if (pListNode) {
 		          lpProc = pListNode->pIOProc;
-		          break;
-		        };
-		      };
+			  }
 		      break;
 	}
 
@@ -1040,13 +1088,22 @@
 }
 
 /**************************************************************************
+ *              mmioInstallIOProc16    [MMSYSTEM.1221]
+ */
+LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC fccIOProc, LPMMIOPROC16 pIOProc,
+                                        DWORD dwFlags)
+{
+	return MMIO_InstallIOProc(fccIOProc, pIOProc, dwFlags, FALSE); 
+}
+
+/**************************************************************************
  * 				mmioInstallIOProcA	   [WINMM.120]
  */
 LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC fccIOProc, 
                                          LPMMIOPROC pIOProc, DWORD dwFlags)
 {
-	return (LPMMIOPROC) mmioInstallIOProc16(fccIOProc,
-                                        (LPMMIOPROC16)pIOProc, dwFlags);
+	return (LPMMIOPROC) MMIO_InstallIOProc(fccIOProc,
+                                        (LPMMIOPROC16)pIOProc, dwFlags, TRUE);
 }
 
 /**************************************************************************
@@ -1058,6 +1115,7 @@
 	LPMMIOINFO16 lpmminfo;
 	LRESULT result;
 	const char *msg = NULL;
+	struct IOProcList *pListNode;
 
 #ifdef DEBUG_RUNTIME
 	switch (uMessage) {
@@ -1082,9 +1140,21 @@
 	
 	lpmminfo = (LPMMIOINFO16)GlobalLock16(hmmio);
 
-	if (lpmminfo && lpmminfo->pIOProc)
+	if (lpmminfo && lpmminfo->pIOProc) {
+		
+		pListNode = MMIO_FindProcNode(lpmminfo->fccIOProc); /* Offset is the same for 16 \
and 32 bit */ +		TRACE("%d bit\n",pListNode->b32bit?32:16);
+		if (pListNode->b32bit) {
+			/* Convert 16 bit internal structure to 32 bit for the mmioproc */
+			MMIOINFO mminfo32;
+
+			MMIO_infoMap16To32(&mminfo32,lpmminfo);			
+			result = (*(&mminfo32)->pIOProc)((LPSTR)&mminfo32, uMessage, lParam1, lParam2);
+			MMIO_infoUnmap16To32(lpmminfo,&mminfo32);
+		} else {
 		result = (*lpmminfo->pIOProc)((LPSTR)lpmminfo, uMessage, lParam1, lParam2);
-	else
+		}
+	} else
 		result = MMSYSERR_INVALPARAM;
 
 	GlobalUnlock16(hmmio);



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic