/************************************************************************** * 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; }
static void test_mmioOpen_fourcc(void) { char fname[] = "file+name.xyz+one.two"; LPMMIOPROC lpProc; HMMIO hmmio; MMIOINFO mmio; lpProc = mmioInstallIOProcA(FOURCC_DOS, mmio_test_IOProc, MMIO_INSTALLPROC); ok(lpProc == mmio_test_IOProc, "mmioInstallIOProcA error\n"); lpProc = mmioInstallIOProcA(FOURCC_XYZ, mmio_test_IOProc, MMIO_INSTALLPROC); ok(lpProc == mmio_test_IOProc, "mmioInstallIOProcA error\n"); memset(&mmio, 0, sizeof(mmio)); hmmio = mmioOpenA(fname, &mmio, MMIO_READ); mmioGetInfo(hmmio, &mmio, 0); ok(hmmio && mmio.fccIOProc == FOURCC_XYZ, "mmioOpenA error %u, got %4.4s\n", mmio.wErrorRet, (LPCSTR)&mmio.fccIOProc); ok(mmio.adwInfo[1] == 0, "mmioOpenA sent MMIOM_SEEK, got %d\n", mmio.adwInfo[1]); ok(mmio.lDiskOffset == 0, "mmioOpenA updated lDiskOffset, got %d\n", mmio.lDiskOffset); mmioClose(hmmio, 0); mmioInstallIOProcA(FOURCC_XYZ, NULL, MMIO_REMOVEPROC); memset(&mmio, 0, sizeof(mmio)); hmmio = mmioOpenA(fname, &mmio, MMIO_READ); mmioGetInfo(hmmio, &mmio, 0); ok(!hmmio && mmio.wErrorRet == MMIOERR_FILENOTFOUND, "mmioOpenA error %u, got %4.4s\n", mmio.wErrorRet, (LPCSTR)&mmio.fccIOProc); mmioClose(hmmio, 0); mmioInstallIOProcA(FOURCC_DOS, NULL, MMIO_REMOVEPROC); }