From: Akihiro Sagawa Subject: [3/3] winmm: Don't call the custom MMIOM_SEEK handler while opening. Message-Id: <20140902000807.F3C2.375B48EC@gmail.com> Date: Tue, 02 Sep 2014 00:10:13 +0900 Fixes bug 36375. --- dlls/winmm/mmio.c | 18 ++++++++++++++---- dlls/winmm/tests/mmio.c | 4 ++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/dlls/winmm/mmio.c b/dlls/winmm/mmio.c index 026bedb..f2a04cf 100644 --- a/dlls/winmm/mmio.c +++ b/dlls/winmm/mmio.c @@ -667,7 +667,7 @@ static HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlags, (LPARAM)szFileName, 0, FALSE); /* update offsets and grab file size, when possible */ - if (wm->info.fccIOProc != FOURCC_MEM && (send_message(wm->ioProc, &wm->info, MMIOM_SEEK, 0, SEEK_CUR, FALSE)) != -1) { + if (wm->info.fccIOProc == FOURCC_DOS && (send_message(wm->ioProc, &wm->info, MMIOM_SEEK, 0, SEEK_CUR, FALSE)) != -1) { pos = wm->info.lBufOffset = wm->info.lDiskOffset; send_message(wm->ioProc, &wm->info, MMIOM_SEEK, 0, SEEK_END, FALSE); wm->dwFileSize = wm->info.lDiskOffset; @@ -885,7 +885,17 @@ LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, INT iOrigin) offset = wm->info.lBufOffset + (wm->info.pchNext - wm->info.pchBuffer) + lOffset; break; case SEEK_END: - offset = ((wm->info.fccIOProc == FOURCC_MEM)? wm->info.cchBuffer : wm->dwFileSize) - lOffset; + switch (wm->info.fccIOProc) { + case FOURCC_MEM: + offset = wm->info.cchBuffer - lOffset; + break; + case FOURCC_DOS: + offset = wm->dwFileSize - lOffset; + break; + default: + offset = send_message(wm->ioProc, &wm->info, MMIOM_SEEK, lOffset, SEEK_END, FALSE); + break; + } break; default: return -1; @@ -896,7 +906,7 @@ LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, INT iOrigin) if ((wm->info.cchBuffer > 0) && ((offset < wm->info.lBufOffset) || (offset > wm->info.lBufOffset + wm->info.cchBuffer) || - (offset > wm->dwFileSize && wm->info.fccIOProc != FOURCC_MEM) || + (offset > wm->dwFileSize && wm->info.fccIOProc == FOURCC_DOS) || !wm->bBufferLoaded)) { /* condition to change buffer */ @@ -1023,7 +1033,7 @@ MMRESULT WINAPI mmioAdvance(HMMIO hmmio, MMIOINFO* lpmmioinfo, UINT uFlags) if (MMIO_Flush(wm, 0) != MMSYSERR_NOERROR) return MMIOERR_CANNOTWRITE; - if (lpmmioinfo) { + if (lpmmioinfo && lpmmioinfo->fccIOProc == FOURCC_DOS) { wm->dwFileSize = max(wm->dwFileSize, lpmmioinfo->lBufOffset + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer)); } diff --git a/dlls/winmm/tests/mmio.c b/dlls/winmm/tests/mmio.c index 57dc166..cf02c0d 100644 --- a/dlls/winmm/tests/mmio.c +++ b/dlls/winmm/tests/mmio.c @@ -636,9 +636,9 @@ static void test_mmioOpen_fourcc(void) mmioGetInfo(hmmio, &mmio, 0); ok(hmmio && mmio.fccIOProc == FOURCC_XYZ, "mmioOpenA error %u, got %4.4s\n", mmio.wErrorRet, (LPCSTR)&mmio.fccIOProc); - todo_wine ok(mmio.adwInfo[1] == 0, "mmioOpenA sent MMIOM_SEEK, got %d\n", + ok(mmio.adwInfo[1] == 0, "mmioOpenA sent MMIOM_SEEK, got %d\n", mmio.adwInfo[1]); - todo_wine ok(mmio.lDiskOffset == 0, "mmioOpenA updated lDiskOffset, got %d\n", + ok(mmio.lDiskOffset == 0, "mmioOpenA updated lDiskOffset, got %d\n", mmio.lDiskOffset); mmioClose(hmmio, 0);