/************************************************************************** * mmioInstallIOProc [MMSYSTEM.1221] */ LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC fccIOProc, LPMMIOPROC16 pIOProc, DWORD dwFlags) { struct mmio_thunk* thunk = NULL; LPMMIOPROC pIOProc32; EnterCriticalSection(&mmio_cs); switch (dwFlags & (MMIO_INSTALLPROC|MMIO_REMOVEPROC|MMIO_FINDPROC)) { case MMIO_INSTALLPROC: if (!(thunk = MMIO_AddThunk(pIOProc, NULL))) { LeaveCriticalSection(&mmio_cs); return NULL; } if (!mmioInstallIOProcA(fccIOProc, (LPMMIOPROC)thunk, dwFlags)) { thunk->pfn16 = NULL; pIOProc = NULL; } break; case MMIO_REMOVEPROC: if (MMIO_Thunks) { for (thunk = MMIO_Thunks; thunk < &MMIO_Thunks[MMIO_MAX_THUNKS]; thunk++) { if (thunk->pfn16 == pIOProc && thunk->segbuffer == 0) { if (mmioInstallIOProcA(fccIOProc, (LPMMIOPROC)thunk, dwFlags)) thunk->pfn16 = NULL; else pIOProc = NULL; break; } } } if (!thunk) pIOProc = NULL; break; case MMIO_FINDPROC: if ((pIOProc32 = mmioInstallIOProcA(fccIOProc, NULL, dwFlags)) && MMIO_Thunks) { for (thunk = MMIO_Thunks; thunk < &MMIO_Thunks[MMIO_MAX_THUNKS]; thunk++) { if ((LPMMIOPROC)thunk == pIOProc32) { pIOProc = thunk->pfn16; break; } } } break; default: WINE_FIXME("Unsupported flags %08x\n", dwFlags); pIOProc = NULL; } LeaveCriticalSection(&mmio_cs); return pIOProc; }
/************************************************************************** * mmioOpen [MMSYSTEM.1210] */ HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16, DWORD dwOpenFlags) { HMMIO ret; if (lpmmioinfo16) { MMIOINFO mmioinfo; struct mmio_thunk* thunk = NULL; memset(&mmioinfo, 0, sizeof(mmioinfo)); EnterCriticalSection(&mmio_cs); if (!(thunk = MMIO_AddThunk(lpmmioinfo16->pIOProc, lpmmioinfo16->pchBuffer))) { LeaveCriticalSection(&mmio_cs); return 0; } mmioinfo.dwFlags = lpmmioinfo16->dwFlags; mmioinfo.fccIOProc = lpmmioinfo16->fccIOProc; mmioinfo.pIOProc = lpmmioinfo16->pIOProc ? (LPMMIOPROC)thunk : 0; mmioinfo.cchBuffer = lpmmioinfo16->cchBuffer; mmioinfo.pchBuffer = MapSL((DWORD)lpmmioinfo16->pchBuffer); mmioinfo.adwInfo[0] = lpmmioinfo16->adwInfo[0]; /* if we don't have a file name, it's likely a passed open file descriptor */ if (!szFileName) mmioinfo.adwInfo[0] = (DWORD)DosFileHandleToWin32Handle(mmioinfo.adwInfo[0]); mmioinfo.adwInfo[1] = lpmmioinfo16->adwInfo[1]; mmioinfo.adwInfo[2] = lpmmioinfo16->adwInfo[2]; ret = mmioOpenA(szFileName, &mmioinfo, dwOpenFlags); if (!ret || (dwOpenFlags & (MMIO_PARSE|MMIO_EXIST))) { 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); lpmmioinfo16->wErrorRet = mmioinfo.wErrorRet; lpmmioinfo16->hmmio = HMMIO_16(mmioinfo.hmmio); } else { ret = mmioOpenA(szFileName, NULL, dwOpenFlags); } return HMMIO_16(ret); }