mmio still buggy
eric pouech
eric.pouech at wanadoo.fr
Fri Dec 21 14:48:34 CST 2001
this patch fixes some mmio bugs (mainly when current file pointer is set
behind
actual size of file). GrooveMechanic no longer crashes with this patch.
A+
--
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: mmio
ChangeLog: fixed another bunch of bugs (mainly linked to operations where file pointer was past the end of file)
GenDate: 2001/12/21 20:31:19 UTC
ModifiedFiles: dlls/winmm/mmio.c dlls/winmm/winemm.h
AddedFiles:
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/winmm/mmio.c,v
retrieving revision 1.28
diff -u -u -r1.28 mmio.c
--- dlls/winmm/mmio.c 2001/12/04 19:40:28 1.28
+++ dlls/winmm/mmio.c 2001/12/16 18:51:20
@@ -43,7 +43,7 @@
{
LRESULT ret = MMSYSERR_NOERROR;
- TRACE("(%p, %X, %ld, %ld);\n", lpmmioinfo, uMessage, lParam1, lParam2);
+ TRACE("(%p, %X, 0x%lx, 0x%lx);\n", lpmmioinfo, uMessage, lParam1, lParam2);
switch (uMessage) {
case MMIOM_OPEN:
@@ -54,9 +54,9 @@
* Returns: zero on success, error code on error
* NOTE: lDiskOffset automatically set to zero
*/
- OFSTRUCT ofs;
- LPCSTR szFileName = (LPCSTR)lParam1;
-
+ OFSTRUCT ofs;
+ LPCSTR szFileName = (LPCSTR)lParam1;
+
if (lpmmioinfo->dwFlags & MMIO_GETTEMP) {
FIXME("MMIO_GETTEMP not implemented\n");
return MMIOERR_CANNOTOPEN;
@@ -68,9 +68,7 @@
lpmmioinfo->adwInfo[0] = DosFileHandleToWin32Handle(lpmmioinfo->adwInfo[0]);
break;
}
-
- lpmmioinfo->adwInfo[0] = (DWORD)OpenFile(szFileName, &ofs,
- lpmmioinfo->dwFlags);
+ lpmmioinfo->adwInfo[0] = (DWORD)OpenFile(szFileName, &ofs, lpmmioinfo->dwFlags & 0xFFFF);
if (lpmmioinfo->adwInfo[0] == (DWORD)HFILE_ERROR)
ret = MMIOERR_CANNOTOPEN;
}
@@ -163,6 +161,7 @@
/* FIXME: io proc shouldn't change it */
if (!(lpmmioinfo->dwFlags & MMIO_CREATE))
lpmmioinfo->pchEndRead = lpmmioinfo->pchEndWrite;
+ lpmmioinfo->adwInfo[0] = HFILE_ERROR;
return 0;
case MMIOM_CLOSE:
@@ -769,8 +768,8 @@
wm->ioProc->count++;
if (dwOpenFlags & MMIO_ALLOCBUF) {
- if ((refmminfo->wErrorRet = mmioSetBuffer(wm->info.hmmio, NULL,
- MMIO_DEFAULTBUFFER, 0)))
+ if ((refmminfo->wErrorRet = MMIO_SetBuffer(wm, NULL, MMIO_DEFAULTBUFFER, 0,
+ type != MMIO_PROC_16)))
goto error1;
} else if (wm->info.fccIOProc == FOURCC_MEM) {
refmminfo->wErrorRet = MMIO_SetBuffer(wm, refmminfo->pchBuffer,
@@ -787,7 +786,10 @@
/* call IO proc to actually open file */
refmminfo->wErrorRet = MMIO_SendMessage(wm, MMIOM_OPEN, (LPARAM)szFileName,
- type == MMIO_PROC_16, MMIO_PROC_32A);
+ type == MMIO_PROC_16, MMIO_PROC_32A);
+
+ /* grab file size, when possible */
+ wm->dwFileSize = GetFileSize(wm->info.adwInfo[0], NULL);
if (refmminfo->wErrorRet == 0)
return wm->info.hmmio;
@@ -904,7 +906,7 @@
result = MMIO_SendMessage(wm, MMIOM_CLOSE, uFlags, 0, MMIO_PROC_32A);
- mmioSetBuffer(hmmio, NULL, 0, 0);
+ MMIO_SetBuffer(wm, NULL, 0, 0, TRUE);
wm->ioProc->count--;
@@ -1069,25 +1071,28 @@
offset = wm->info.lBufOffset + (wm->info.pchNext - wm->info.pchBuffer) + lOffset;
break;
case SEEK_END:
- if (wm->info.fccIOProc == FOURCC_MEM) {
- offset = wm->info.cchBuffer;
- } else {
- assert(MMIO_SendMessage(wm, MMIOM_SEEK, 0, SEEK_CUR, MMIO_PROC_32A) == wm->info.lDiskOffset);
- offset = MMIO_SendMessage(wm, MMIOM_SEEK, 0, SEEK_END, MMIO_PROC_32A);
- MMIO_SendMessage(wm, MMIOM_SEEK, wm->info.lDiskOffset, SEEK_SET, MMIO_PROC_32A);
- }
- offset -= lOffset;
+ offset = ((wm->info.fccIOProc == FOURCC_MEM)? wm->info.cchBuffer : wm->dwFileSize) - lOffset;
break;
default:
return -1;
}
- /* stay in same buffer ? */
- /* some memory mapped buffers are defined with -1 as a size */
- if ((wm->info.cchBuffer > 0) &&
+ if (offset && offset >= wm->dwFileSize && wm->info.fccIOProc != FOURCC_MEM) {
+ /* should check that write mode exists */
+ if (MMIO_Flush(wm, 0) != MMSYSERR_NOERROR)
+ return -1;
+ wm->info.lBufOffset = offset;
+ wm->info.pchEndRead = wm->info.pchBuffer;
+ wm->info.pchEndWrite = wm->info.pchBuffer + wm->info.cchBuffer;
+ if ((wm->info.dwFlags & MMIO_RWMODE) == MMIO_READ) {
+ wm->info.lDiskOffset = wm->dwFileSize;
+ }
+ } else if ((wm->info.cchBuffer > 0) &&
((offset < wm->info.lBufOffset) ||
(offset >= wm->info.lBufOffset + wm->info.cchBuffer) ||
!wm->bBufferLoaded)) {
+ /* stay in same buffer ? */
+ /* some memory mapped buffers are defined with -1 as a size */
/* condition to change buffer */
if ((wm->info.fccIOProc == FOURCC_MEM) ||
@@ -1305,7 +1310,6 @@
if (uFlags == MMIO_WRITE && (lpmmioinfo->dwFlags & MMIO_DIRTY))
{
- FIXME("writing data to disk\n");
MMIO_SendMessage(wm, MMIOM_SEEK, lpmmioinfo->lBufOffset, SEEK_SET, MMIO_PROC_32A);
MMIO_SendMessage(wm, MMIOM_WRITE, (LPARAM)lpmmioinfo->pchBuffer,
lpmmioinfo->pchNext - lpmmioinfo->pchBuffer, MMIO_PROC_32A);
@@ -1313,6 +1317,7 @@
}
if (MMIO_Flush(wm, 0) != MMSYSERR_NOERROR)
return MMIOERR_CANNOTWRITE;
+ wm->dwFileSize = max(wm->dwFileSize, lpmmioinfo->lBufOffset + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer));
MMIO_GrabNextBuffer(wm, uFlags == MMIO_READ);
Index: dlls/winmm/winemm.h
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/winmm/winemm.h,v
retrieving revision 1.7
diff -u -u -r1.7 winemm.h
--- dlls/winmm/winemm.h 2001/07/20 18:00:03 1.7
+++ dlls/winmm/winemm.h 2001/12/16 15:46:58
@@ -140,6 +140,7 @@
SEGPTR buffer16;
struct tagWINE_MMIO* lpNext;
BOOL bBufferLoaded;
+ DWORD dwFileSize;
} WINE_MMIO, *LPWINE_MMIO;
typedef struct tagWINE_MM_IDATA {
More information about the wine-patches
mailing list