[PATCH 1/3] [MMSystem]: move the 16bit mmio code into a dedicated file (mmio16.c)
Eric Pouech
eric.pouech at orange.fr
Wed Oct 14 14:55:57 CDT 2009
A+
---
dlls/winmm/Makefile.in | 1
dlls/winmm/mmio16.c | 449 ++++++++++++++++++++++++++++++++++++++++++++++++
dlls/winmm/mmsystem.c | 411 --------------------------------------------
3 files changed, 451 insertions(+), 410 deletions(-)
create mode 100644 dlls/winmm/mmio16.c
diff --git a/dlls/winmm/Makefile.in b/dlls/winmm/Makefile.in
index 64c7b5b..6a755b4 100644
--- a/dlls/winmm/Makefile.in
+++ b/dlls/winmm/Makefile.in
@@ -19,6 +19,7 @@ C_SRCS = \
C_SRCS16 = \
message16.c \
+ mmio16.c \
mmsystem.c
SPEC_SRCS16 = \
diff --git a/dlls/winmm/mmio16.c b/dlls/winmm/mmio16.c
new file mode 100644
index 0000000..e514feb
--- /dev/null
+++ b/dlls/winmm/mmio16.c
@@ -0,0 +1,449 @@
+/*
+ * MMSYSTEM mmio* functions
+ *
+ * Copyright 1993 Martin Ayotte
+ * 1998-2003 Eric Pouech
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include <string.h>
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "windef.h"
+#include "winbase.h"
+#include "mmsystem.h"
+#include "winternl.h"
+#include "wownt32.h"
+#include "winnls.h"
+
+#include "wine/winuser16.h"
+#include "winemm.h"
+#include "winemm16.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mmsys);
+
+/* ###################################################
+ * # MMIO #
+ * ###################################################
+ */
+
+/****************************************************************
+ * MMIO_Map32To16 [INTERNAL]
+ */
+static LRESULT MMIO_Map32To16(DWORD wMsg, LPARAM* lp1, LPARAM* lp2)
+{
+ switch (wMsg) {
+ case MMIOM_CLOSE:
+ case MMIOM_SEEK:
+ /* nothing to do */
+ break;
+ case MMIOM_OPEN:
+ case MMIOM_READ:
+ case MMIOM_WRITE:
+ case MMIOM_WRITEFLUSH:
+ *lp1 = MapLS( (void *)*lp1 );
+ break;
+ case MMIOM_RENAME:
+ *lp1 = MapLS( (void *)*lp1 );
+ *lp2 = MapLS( (void *)*lp2 );
+ break;
+ default:
+ if (wMsg < MMIOM_USER)
+ TRACE("Not a mappable message (%d)\n", wMsg);
+ }
+ return MMSYSERR_NOERROR;
+}
+
+/****************************************************************
+ * MMIO_UnMap32To16 [INTERNAL]
+ */
+static LRESULT MMIO_UnMap32To16(DWORD wMsg, LPARAM lParam1, LPARAM lParam2,
+ LPARAM lp1, LPARAM lp2)
+{
+ switch (wMsg) {
+ case MMIOM_CLOSE:
+ case MMIOM_SEEK:
+ /* nothing to do */
+ break;
+ case MMIOM_OPEN:
+ case MMIOM_READ:
+ case MMIOM_WRITE:
+ case MMIOM_WRITEFLUSH:
+ UnMapLS( lp1 );
+ break;
+ case MMIOM_RENAME:
+ UnMapLS( lp1 );
+ UnMapLS( lp2 );
+ break;
+ default:
+ if (wMsg < MMIOM_USER)
+ TRACE("Not a mappable message (%d)\n", wMsg);
+ }
+ return MMSYSERR_NOERROR;
+}
+
+/******************************************************************
+ * MMIO_Callback16
+ *
+ *
+ */
+LRESULT MMIO_Callback16(SEGPTR cb16, LPMMIOINFO lpmmioinfo, UINT uMessage,
+ LPARAM lParam1, LPARAM lParam2)
+{
+ DWORD result;
+ MMIOINFO16 mmioInfo16;
+ SEGPTR segmmioInfo16;
+ LPARAM lp1 = lParam1, lp2 = lParam2;
+ WORD args[7];
+
+ memset(&mmioInfo16, 0, sizeof(MMIOINFO16));
+ mmioInfo16.lDiskOffset = lpmmioinfo->lDiskOffset;
+ mmioInfo16.adwInfo[0] = lpmmioinfo->adwInfo[0];
+ mmioInfo16.adwInfo[1] = lpmmioinfo->adwInfo[1];
+ mmioInfo16.adwInfo[2] = lpmmioinfo->adwInfo[2];
+ /* map (lParam1, lParam2) into (lp1, lp2) 32=>16 */
+ if ((result = MMIO_Map32To16(uMessage, &lp1, &lp2)) != MMSYSERR_NOERROR)
+ return result;
+
+ segmmioInfo16 = MapLS(&mmioInfo16);
+ args[6] = HIWORD(segmmioInfo16);
+ args[5] = LOWORD(segmmioInfo16);
+ args[4] = uMessage;
+ args[3] = HIWORD(lp1);
+ args[2] = LOWORD(lp1);
+ args[1] = HIWORD(lp2);
+ args[0] = LOWORD(lp2);
+ WOWCallback16Ex( cb16, WCB16_PASCAL, sizeof(args), args, &result );
+ UnMapLS(segmmioInfo16);
+ MMIO_UnMap32To16(uMessage, lParam1, lParam2, lp1, lp2);
+
+ lpmmioinfo->lDiskOffset = mmioInfo16.lDiskOffset;
+ lpmmioinfo->adwInfo[0] = mmioInfo16.adwInfo[0];
+ lpmmioinfo->adwInfo[1] = mmioInfo16.adwInfo[1];
+ lpmmioinfo->adwInfo[2] = mmioInfo16.adwInfo[2];
+
+ return result;
+}
+
+/******************************************************************
+ * MMIO_ResetSegmentedData
+ *
+ */
+static LRESULT MMIO_SetSegmentedBuffer(HMMIO hmmio, SEGPTR ptr, BOOL release)
+{
+ LPWINE_MMIO wm;
+
+ if ((wm = MMIO_Get(hmmio)) == NULL)
+ return MMSYSERR_INVALHANDLE;
+ if (release) UnMapLS(wm->segBuffer16);
+ wm->segBuffer16 = ptr;
+ return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ * mmioOpen [MMSYSTEM.1210]
+ */
+HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16,
+ DWORD dwOpenFlags)
+{
+ HMMIO ret;
+
+ if (lpmmioinfo16) {
+ MMIOINFO mmioinfo;
+
+ memset(&mmioinfo, 0, sizeof(mmioinfo));
+
+ mmioinfo.dwFlags = lpmmioinfo16->dwFlags;
+ mmioinfo.fccIOProc = lpmmioinfo16->fccIOProc;
+ mmioinfo.pIOProc = (LPMMIOPROC)lpmmioinfo16->pIOProc;
+ 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 = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, MMIO_PROC_16);
+ MMIO_SetSegmentedBuffer(mmioinfo.hmmio, (SEGPTR)lpmmioinfo16->pchBuffer, FALSE);
+
+ lpmmioinfo16->wErrorRet = mmioinfo.wErrorRet;
+ lpmmioinfo16->hmmio = HMMIO_16(mmioinfo.hmmio);
+ } else {
+ ret = MMIO_Open(szFileName, NULL, dwOpenFlags, MMIO_PROC_32A);
+ }
+ return HMMIO_16(ret);
+}
+
+/**************************************************************************
+ * mmioClose [MMSYSTEM.1211]
+ */
+MMRESULT16 WINAPI mmioClose16(HMMIO16 hmmio, UINT16 uFlags)
+{
+ MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), 0, TRUE);
+ return mmioClose(HMMIO_32(hmmio), uFlags);
+}
+
+/**************************************************************************
+ * mmioRead [MMSYSTEM.1212]
+ */
+LONG WINAPI mmioRead16(HMMIO16 hmmio, HPSTR pch, LONG cch)
+{
+ return mmioRead(HMMIO_32(hmmio), pch, cch);
+}
+
+/**************************************************************************
+ * mmioWrite [MMSYSTEM.1213]
+ */
+LONG WINAPI mmioWrite16(HMMIO16 hmmio, HPCSTR pch, LONG cch)
+{
+ return mmioWrite(HMMIO_32(hmmio),pch,cch);
+}
+
+/**************************************************************************
+ * mmioSeek [MMSYSTEM.1214]
+ */
+LONG WINAPI mmioSeek16(HMMIO16 hmmio, LONG lOffset, INT16 iOrigin)
+{
+ return mmioSeek(HMMIO_32(hmmio), lOffset, iOrigin);
+}
+
+/**************************************************************************
+ * mmioGetInfo [MMSYSTEM.1215]
+ */
+MMRESULT16 WINAPI mmioGetInfo16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags)
+{
+ MMIOINFO mmioinfo;
+ MMRESULT ret;
+ LPWINE_MMIO wm;
+
+ TRACE("(0x%04x,%p,0x%08x)\n", hmmio, lpmmioinfo, uFlags);
+
+ if ((wm = MMIO_Get(HMMIO_32(hmmio))) == NULL)
+ return MMSYSERR_INVALHANDLE;
+
+ ret = mmioGetInfo(HMMIO_32(hmmio), &mmioinfo, uFlags);
+ if (ret != MMSYSERR_NOERROR) return ret;
+
+ lpmmioinfo->dwFlags = mmioinfo.dwFlags;
+ lpmmioinfo->fccIOProc = mmioinfo.fccIOProc;
+ lpmmioinfo->pIOProc = (wm->ioProc->type == MMIO_PROC_16) ?
+ (LPMMIOPROC16)wm->ioProc->pIOProc : NULL;
+ lpmmioinfo->wErrorRet = mmioinfo.wErrorRet;
+ lpmmioinfo->hTask = HTASK_16(mmioinfo.hTask);
+ lpmmioinfo->cchBuffer = mmioinfo.cchBuffer;
+ lpmmioinfo->pchBuffer = (void*)wm->segBuffer16;
+ lpmmioinfo->pchNext = (void*)(wm->segBuffer16 + (mmioinfo.pchNext - mmioinfo.pchBuffer));
+ lpmmioinfo->pchEndRead = (void*)(wm->segBuffer16 + (mmioinfo.pchEndRead - mmioinfo.pchBuffer));
+ lpmmioinfo->pchEndWrite = (void*)(wm->segBuffer16 + (mmioinfo.pchEndWrite - mmioinfo.pchBuffer));
+ lpmmioinfo->lBufOffset = mmioinfo.lBufOffset;
+ lpmmioinfo->lDiskOffset = mmioinfo.lDiskOffset;
+ lpmmioinfo->adwInfo[0] = mmioinfo.adwInfo[0];
+ lpmmioinfo->adwInfo[1] = mmioinfo.adwInfo[1];
+ lpmmioinfo->adwInfo[2] = mmioinfo.adwInfo[2];
+ lpmmioinfo->dwReserved1 = 0;
+ lpmmioinfo->dwReserved2 = 0;
+ lpmmioinfo->hmmio = HMMIO_16(mmioinfo.hmmio);
+
+ return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ * mmioSetInfo [MMSYSTEM.1216]
+ */
+MMRESULT16 WINAPI mmioSetInfo16(HMMIO16 hmmio, const MMIOINFO16* lpmmioinfo, UINT16 uFlags)
+{
+ MMIOINFO mmioinfo;
+ MMRESULT ret;
+
+ TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags);
+
+ ret = mmioGetInfo(HMMIO_32(hmmio), &mmioinfo, 0);
+ if (ret != MMSYSERR_NOERROR) return ret;
+
+ /* check if seg and lin buffers are the same */
+ if (mmioinfo.cchBuffer != lpmmioinfo->cchBuffer ||
+ mmioinfo.pchBuffer != MapSL((DWORD)lpmmioinfo->pchBuffer))
+ return MMSYSERR_INVALPARAM;
+
+ /* check pointers coherence */
+ if (lpmmioinfo->pchNext < lpmmioinfo->pchBuffer ||
+ lpmmioinfo->pchNext > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer ||
+ lpmmioinfo->pchEndRead < lpmmioinfo->pchBuffer ||
+ lpmmioinfo->pchEndRead > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer ||
+ lpmmioinfo->pchEndWrite < lpmmioinfo->pchBuffer ||
+ lpmmioinfo->pchEndWrite > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer)
+ return MMSYSERR_INVALPARAM;
+
+ mmioinfo.pchNext = mmioinfo.pchBuffer + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer);
+ mmioinfo.pchEndRead = mmioinfo.pchBuffer + (lpmmioinfo->pchEndRead - lpmmioinfo->pchBuffer);
+ mmioinfo.pchEndWrite = mmioinfo.pchBuffer + (lpmmioinfo->pchEndWrite - lpmmioinfo->pchBuffer);
+
+ return mmioSetInfo(HMMIO_32(hmmio), &mmioinfo, uFlags);
+}
+
+/**************************************************************************
+ * mmioSetBuffer [MMSYSTEM.1217]
+ */
+MMRESULT16 WINAPI mmioSetBuffer16(HMMIO16 hmmio, LPSTR pchBuffer,
+ LONG cchBuffer, UINT16 uFlags)
+{
+ MMRESULT ret = mmioSetBuffer(HMMIO_32(hmmio), MapSL((DWORD)pchBuffer),
+ cchBuffer, uFlags);
+
+ if (ret == MMSYSERR_NOERROR)
+ MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), (DWORD)pchBuffer, TRUE);
+ else
+ UnMapLS((DWORD)pchBuffer);
+ return ret;
+}
+
+/**************************************************************************
+ * mmioFlush [MMSYSTEM.1218]
+ */
+MMRESULT16 WINAPI mmioFlush16(HMMIO16 hmmio, UINT16 uFlags)
+{
+ return mmioFlush(HMMIO_32(hmmio), uFlags);
+}
+
+/***********************************************************************
+ * mmioAdvance [MMSYSTEM.1219]
+ */
+MMRESULT16 WINAPI mmioAdvance16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags)
+{
+ MMIOINFO mmioinfo;
+ LRESULT ret;
+
+ /* WARNING: this heavily relies on mmioAdvance implementation (for choosing which
+ * fields to init
+ */
+ if (lpmmioinfo)
+ {
+ mmioinfo.pchBuffer = MapSL((DWORD)lpmmioinfo->pchBuffer);
+ mmioinfo.pchNext = MapSL((DWORD)lpmmioinfo->pchNext);
+ mmioinfo.dwFlags = lpmmioinfo->dwFlags;
+ mmioinfo.lBufOffset = lpmmioinfo->lBufOffset;
+ ret = mmioAdvance(HMMIO_32(hmmio), &mmioinfo, uFlags);
+ }
+ else
+ ret = mmioAdvance(HMMIO_32(hmmio), NULL, uFlags);
+
+ if (ret != MMSYSERR_NOERROR) return ret;
+
+ if (lpmmioinfo)
+ {
+ lpmmioinfo->dwFlags = mmioinfo.dwFlags;
+ lpmmioinfo->pchNext = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchNext - mmioinfo.pchBuffer));
+ lpmmioinfo->pchEndRead = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchEndRead - mmioinfo.pchBuffer));
+ lpmmioinfo->pchEndWrite = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchEndWrite - mmioinfo.pchBuffer));
+ lpmmioinfo->lBufOffset = mmioinfo.lBufOffset;
+ lpmmioinfo->lDiskOffset = mmioinfo.lDiskOffset;
+ }
+
+ return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ * mmioStringToFOURCC [MMSYSTEM.1220]
+ */
+FOURCC WINAPI mmioStringToFOURCC16(LPCSTR sz, UINT16 uFlags)
+{
+ return mmioStringToFOURCCA(sz, uFlags);
+}
+
+/**************************************************************************
+ * mmioInstallIOProc [MMSYSTEM.1221]
+ */
+LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC fccIOProc, LPMMIOPROC16 pIOProc,
+ DWORD dwFlags)
+{
+ return (LPMMIOPROC16)MMIO_InstallIOProc(fccIOProc, (LPMMIOPROC)pIOProc,
+ dwFlags, MMIO_PROC_16);
+}
+
+/**************************************************************************
+ * mmioSendMessage [MMSYSTEM.1222]
+ */
+LRESULT WINAPI mmioSendMessage16(HMMIO16 hmmio, UINT16 uMessage,
+ LPARAM lParam1, LPARAM lParam2)
+{
+ return MMIO_SendMessage(HMMIO_32(hmmio), uMessage,
+ lParam1, lParam2, MMIO_PROC_16);
+}
+
+/**************************************************************************
+ * mmioDescend [MMSYSTEM.1223]
+ */
+MMRESULT16 WINAPI mmioDescend16(HMMIO16 hmmio, LPMMCKINFO lpck,
+ const MMCKINFO* lpckParent, UINT16 uFlags)
+{
+ return mmioDescend(HMMIO_32(hmmio), lpck, lpckParent, uFlags);
+}
+
+/**************************************************************************
+ * mmioAscend [MMSYSTEM.1224]
+ */
+MMRESULT16 WINAPI mmioAscend16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags)
+{
+ return mmioAscend(HMMIO_32(hmmio),lpck,uFlags);
+}
+
+/**************************************************************************
+ * mmioCreateChunk [MMSYSTEM.1225]
+ */
+MMRESULT16 WINAPI mmioCreateChunk16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags)
+{
+ return mmioCreateChunk(HMMIO_32(hmmio), lpck, uFlags);
+}
+
+/**************************************************************************
+ * mmioRename [MMSYSTEM.1226]
+ */
+MMRESULT16 WINAPI mmioRename16(LPCSTR szFileName, LPCSTR szNewFileName,
+ MMIOINFO16* lpmmioinfo, DWORD dwRenameFlags)
+{
+ BOOL inst = FALSE;
+ MMRESULT ret;
+ MMIOINFO mmioinfo;
+
+ if (lpmmioinfo != NULL && lpmmioinfo->pIOProc != NULL &&
+ lpmmioinfo->fccIOProc == 0) {
+ FIXME("Can't handle this case yet\n");
+ return MMSYSERR_ERROR;
+ }
+
+ /* this is a bit hacky, but it'll work if we get a fourCC code or nothing.
+ * but a non installed ioproc without a fourcc won't do
+ */
+ if (lpmmioinfo && lpmmioinfo->fccIOProc && lpmmioinfo->pIOProc) {
+ MMIO_InstallIOProc(lpmmioinfo->fccIOProc, (LPMMIOPROC)lpmmioinfo->pIOProc,
+ MMIO_INSTALLPROC, MMIO_PROC_16);
+ inst = TRUE;
+ }
+ memset(&mmioinfo, 0, sizeof(mmioinfo));
+ mmioinfo.fccIOProc = lpmmioinfo->fccIOProc;
+ ret = mmioRenameA(szFileName, szNewFileName, &mmioinfo, dwRenameFlags);
+ if (inst) {
+ MMIO_InstallIOProc(lpmmioinfo->fccIOProc, NULL,
+ MMIO_REMOVEPROC, MMIO_PROC_16);
+ }
+ return ret;
+}
diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c
index dfe9be4..2603864 100644
--- a/dlls/winmm/mmsystem.c
+++ b/dlls/winmm/mmsystem.c
@@ -50,7 +50,7 @@ static WINE_MMTHREAD* WINMM_GetmmThread(HANDLE16);
static LPWINE_DRIVER DRIVER_OpenDriver16(LPCWSTR, LPCWSTR, LPARAM);
static LRESULT DRIVER_CloseDriver16(HDRVR16, LPARAM, LPARAM);
static LRESULT DRIVER_SendMessage16(HDRVR16, UINT, LPARAM, LPARAM);
-static LRESULT MMIO_Callback16(SEGPTR, LPMMIOINFO, UINT, LPARAM, LPARAM);
+extern LRESULT MMIO_Callback16(SEGPTR, LPMMIOINFO, UINT, LPARAM, LPARAM);
/* ###################################################
* # LIBRARY #
@@ -2649,415 +2649,6 @@ BOOL16 WINAPI mciFreeCommandResource16(UINT16 uTable)
}
/* ###################################################
- * # MMIO #
- * ###################################################
- */
-
-/****************************************************************
- * MMIO_Map32To16 [INTERNAL]
- */
-static LRESULT MMIO_Map32To16(DWORD wMsg, LPARAM* lp1, LPARAM* lp2)
-{
- switch (wMsg) {
- case MMIOM_CLOSE:
- case MMIOM_SEEK:
- /* nothing to do */
- break;
- case MMIOM_OPEN:
- case MMIOM_READ:
- case MMIOM_WRITE:
- case MMIOM_WRITEFLUSH:
- *lp1 = MapLS( (void *)*lp1 );
- break;
- case MMIOM_RENAME:
- *lp1 = MapLS( (void *)*lp1 );
- *lp2 = MapLS( (void *)*lp2 );
- break;
- default:
- if (wMsg < MMIOM_USER)
- TRACE("Not a mappable message (%d)\n", wMsg);
- }
- return MMSYSERR_NOERROR;
-}
-
-/****************************************************************
- * MMIO_UnMap32To16 [INTERNAL]
- */
-static LRESULT MMIO_UnMap32To16(DWORD wMsg, LPARAM lParam1, LPARAM lParam2,
- LPARAM lp1, LPARAM lp2)
-{
- switch (wMsg) {
- case MMIOM_CLOSE:
- case MMIOM_SEEK:
- /* nothing to do */
- break;
- case MMIOM_OPEN:
- case MMIOM_READ:
- case MMIOM_WRITE:
- case MMIOM_WRITEFLUSH:
- UnMapLS( lp1 );
- break;
- case MMIOM_RENAME:
- UnMapLS( lp1 );
- UnMapLS( lp2 );
- break;
- default:
- if (wMsg < MMIOM_USER)
- TRACE("Not a mappable message (%d)\n", wMsg);
- }
- return MMSYSERR_NOERROR;
-}
-
-/******************************************************************
- * MMIO_Callback16
- *
- *
- */
-static LRESULT MMIO_Callback16(SEGPTR cb16, LPMMIOINFO lpmmioinfo, UINT uMessage,
- LPARAM lParam1, LPARAM lParam2)
-{
- DWORD result;
- MMIOINFO16 mmioInfo16;
- SEGPTR segmmioInfo16;
- LPARAM lp1 = lParam1, lp2 = lParam2;
- WORD args[7];
-
- memset(&mmioInfo16, 0, sizeof(MMIOINFO16));
- mmioInfo16.lDiskOffset = lpmmioinfo->lDiskOffset;
- mmioInfo16.adwInfo[0] = lpmmioinfo->adwInfo[0];
- mmioInfo16.adwInfo[1] = lpmmioinfo->adwInfo[1];
- mmioInfo16.adwInfo[2] = lpmmioinfo->adwInfo[2];
- /* map (lParam1, lParam2) into (lp1, lp2) 32=>16 */
- if ((result = MMIO_Map32To16(uMessage, &lp1, &lp2)) != MMSYSERR_NOERROR)
- return result;
-
- segmmioInfo16 = MapLS(&mmioInfo16);
- args[6] = HIWORD(segmmioInfo16);
- args[5] = LOWORD(segmmioInfo16);
- args[4] = uMessage;
- args[3] = HIWORD(lp1);
- args[2] = LOWORD(lp1);
- args[1] = HIWORD(lp2);
- args[0] = LOWORD(lp2);
- WOWCallback16Ex( cb16, WCB16_PASCAL, sizeof(args), args, &result );
- UnMapLS(segmmioInfo16);
- MMIO_UnMap32To16(uMessage, lParam1, lParam2, lp1, lp2);
-
- lpmmioinfo->lDiskOffset = mmioInfo16.lDiskOffset;
- lpmmioinfo->adwInfo[0] = mmioInfo16.adwInfo[0];
- lpmmioinfo->adwInfo[1] = mmioInfo16.adwInfo[1];
- lpmmioinfo->adwInfo[2] = mmioInfo16.adwInfo[2];
-
- return result;
-}
-
-/******************************************************************
- * MMIO_ResetSegmentedData
- *
- */
-static LRESULT MMIO_SetSegmentedBuffer(HMMIO hmmio, SEGPTR ptr, BOOL release)
-{
- LPWINE_MMIO wm;
-
- if ((wm = MMIO_Get(hmmio)) == NULL)
- return MMSYSERR_INVALHANDLE;
- if (release) UnMapLS(wm->segBuffer16);
- wm->segBuffer16 = ptr;
- return MMSYSERR_NOERROR;
-}
-
-/**************************************************************************
- * mmioOpen [MMSYSTEM.1210]
- */
-HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16,
- DWORD dwOpenFlags)
-{
- HMMIO ret;
-
- if (lpmmioinfo16) {
- MMIOINFO mmioinfo;
-
- memset(&mmioinfo, 0, sizeof(mmioinfo));
-
- mmioinfo.dwFlags = lpmmioinfo16->dwFlags;
- mmioinfo.fccIOProc = lpmmioinfo16->fccIOProc;
- mmioinfo.pIOProc = (LPMMIOPROC)lpmmioinfo16->pIOProc;
- 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 = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, MMIO_PROC_16);
- MMIO_SetSegmentedBuffer(mmioinfo.hmmio, (SEGPTR)lpmmioinfo16->pchBuffer, FALSE);
-
- lpmmioinfo16->wErrorRet = mmioinfo.wErrorRet;
- lpmmioinfo16->hmmio = HMMIO_16(mmioinfo.hmmio);
- } else {
- ret = MMIO_Open(szFileName, NULL, dwOpenFlags, MMIO_PROC_32A);
- }
- return HMMIO_16(ret);
-}
-
-/**************************************************************************
- * mmioClose [MMSYSTEM.1211]
- */
-MMRESULT16 WINAPI mmioClose16(HMMIO16 hmmio, UINT16 uFlags)
-{
- MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), 0, TRUE);
- return mmioClose(HMMIO_32(hmmio), uFlags);
-}
-
-/**************************************************************************
- * mmioRead [MMSYSTEM.1212]
- */
-LONG WINAPI mmioRead16(HMMIO16 hmmio, HPSTR pch, LONG cch)
-{
- return mmioRead(HMMIO_32(hmmio), pch, cch);
-}
-
-/**************************************************************************
- * mmioWrite [MMSYSTEM.1213]
- */
-LONG WINAPI mmioWrite16(HMMIO16 hmmio, HPCSTR pch, LONG cch)
-{
- return mmioWrite(HMMIO_32(hmmio),pch,cch);
-}
-
-/**************************************************************************
- * mmioSeek [MMSYSTEM.1214]
- */
-LONG WINAPI mmioSeek16(HMMIO16 hmmio, LONG lOffset, INT16 iOrigin)
-{
- return mmioSeek(HMMIO_32(hmmio), lOffset, iOrigin);
-}
-
-/**************************************************************************
- * mmioGetInfo [MMSYSTEM.1215]
- */
-MMRESULT16 WINAPI mmioGetInfo16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags)
-{
- MMIOINFO mmioinfo;
- MMRESULT ret;
- LPWINE_MMIO wm;
-
- TRACE("(0x%04x,%p,0x%08x)\n", hmmio, lpmmioinfo, uFlags);
-
- if ((wm = MMIO_Get(HMMIO_32(hmmio))) == NULL)
- return MMSYSERR_INVALHANDLE;
-
- ret = mmioGetInfo(HMMIO_32(hmmio), &mmioinfo, uFlags);
- if (ret != MMSYSERR_NOERROR) return ret;
-
- lpmmioinfo->dwFlags = mmioinfo.dwFlags;
- lpmmioinfo->fccIOProc = mmioinfo.fccIOProc;
- lpmmioinfo->pIOProc = (wm->ioProc->type == MMIO_PROC_16) ?
- (LPMMIOPROC16)wm->ioProc->pIOProc : NULL;
- lpmmioinfo->wErrorRet = mmioinfo.wErrorRet;
- lpmmioinfo->hTask = HTASK_16(mmioinfo.hTask);
- lpmmioinfo->cchBuffer = mmioinfo.cchBuffer;
- lpmmioinfo->pchBuffer = (void*)wm->segBuffer16;
- lpmmioinfo->pchNext = (void*)(wm->segBuffer16 + (mmioinfo.pchNext - mmioinfo.pchBuffer));
- lpmmioinfo->pchEndRead = (void*)(wm->segBuffer16 + (mmioinfo.pchEndRead - mmioinfo.pchBuffer));
- lpmmioinfo->pchEndWrite = (void*)(wm->segBuffer16 + (mmioinfo.pchEndWrite - mmioinfo.pchBuffer));
- lpmmioinfo->lBufOffset = mmioinfo.lBufOffset;
- lpmmioinfo->lDiskOffset = mmioinfo.lDiskOffset;
- lpmmioinfo->adwInfo[0] = mmioinfo.adwInfo[0];
- lpmmioinfo->adwInfo[1] = mmioinfo.adwInfo[1];
- lpmmioinfo->adwInfo[2] = mmioinfo.adwInfo[2];
- lpmmioinfo->dwReserved1 = 0;
- lpmmioinfo->dwReserved2 = 0;
- lpmmioinfo->hmmio = HMMIO_16(mmioinfo.hmmio);
-
- return MMSYSERR_NOERROR;
-}
-
-/**************************************************************************
- * mmioSetInfo [MMSYSTEM.1216]
- */
-MMRESULT16 WINAPI mmioSetInfo16(HMMIO16 hmmio, const MMIOINFO16* lpmmioinfo, UINT16 uFlags)
-{
- MMIOINFO mmioinfo;
- MMRESULT ret;
-
- TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags);
-
- ret = mmioGetInfo(HMMIO_32(hmmio), &mmioinfo, 0);
- if (ret != MMSYSERR_NOERROR) return ret;
-
- /* check if seg and lin buffers are the same */
- if (mmioinfo.cchBuffer != lpmmioinfo->cchBuffer ||
- mmioinfo.pchBuffer != MapSL((DWORD)lpmmioinfo->pchBuffer))
- return MMSYSERR_INVALPARAM;
-
- /* check pointers coherence */
- if (lpmmioinfo->pchNext < lpmmioinfo->pchBuffer ||
- lpmmioinfo->pchNext > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer ||
- lpmmioinfo->pchEndRead < lpmmioinfo->pchBuffer ||
- lpmmioinfo->pchEndRead > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer ||
- lpmmioinfo->pchEndWrite < lpmmioinfo->pchBuffer ||
- lpmmioinfo->pchEndWrite > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer)
- return MMSYSERR_INVALPARAM;
-
- mmioinfo.pchNext = mmioinfo.pchBuffer + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer);
- mmioinfo.pchEndRead = mmioinfo.pchBuffer + (lpmmioinfo->pchEndRead - lpmmioinfo->pchBuffer);
- mmioinfo.pchEndWrite = mmioinfo.pchBuffer + (lpmmioinfo->pchEndWrite - lpmmioinfo->pchBuffer);
-
- return mmioSetInfo(HMMIO_32(hmmio), &mmioinfo, uFlags);
-}
-
-/**************************************************************************
- * mmioSetBuffer [MMSYSTEM.1217]
- */
-MMRESULT16 WINAPI mmioSetBuffer16(HMMIO16 hmmio, LPSTR pchBuffer,
- LONG cchBuffer, UINT16 uFlags)
-{
- MMRESULT ret = mmioSetBuffer(HMMIO_32(hmmio), MapSL((DWORD)pchBuffer),
- cchBuffer, uFlags);
-
- if (ret == MMSYSERR_NOERROR)
- MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), (DWORD)pchBuffer, TRUE);
- else
- UnMapLS((DWORD)pchBuffer);
- return ret;
-}
-
-/**************************************************************************
- * mmioFlush [MMSYSTEM.1218]
- */
-MMRESULT16 WINAPI mmioFlush16(HMMIO16 hmmio, UINT16 uFlags)
-{
- return mmioFlush(HMMIO_32(hmmio), uFlags);
-}
-
-/***********************************************************************
- * mmioAdvance [MMSYSTEM.1219]
- */
-MMRESULT16 WINAPI mmioAdvance16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags)
-{
- MMIOINFO mmioinfo;
- LRESULT ret;
-
- /* WARNING: this heavily relies on mmioAdvance implementation (for choosing which
- * fields to init
- */
- if (lpmmioinfo)
- {
- mmioinfo.pchBuffer = MapSL((DWORD)lpmmioinfo->pchBuffer);
- mmioinfo.pchNext = MapSL((DWORD)lpmmioinfo->pchNext);
- mmioinfo.dwFlags = lpmmioinfo->dwFlags;
- mmioinfo.lBufOffset = lpmmioinfo->lBufOffset;
- ret = mmioAdvance(HMMIO_32(hmmio), &mmioinfo, uFlags);
- }
- else
- ret = mmioAdvance(HMMIO_32(hmmio), NULL, uFlags);
-
- if (ret != MMSYSERR_NOERROR) return ret;
-
- if (lpmmioinfo)
- {
- lpmmioinfo->dwFlags = mmioinfo.dwFlags;
- lpmmioinfo->pchNext = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchNext - mmioinfo.pchBuffer));
- lpmmioinfo->pchEndRead = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchEndRead - mmioinfo.pchBuffer));
- lpmmioinfo->pchEndWrite = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchEndWrite - mmioinfo.pchBuffer));
- lpmmioinfo->lBufOffset = mmioinfo.lBufOffset;
- lpmmioinfo->lDiskOffset = mmioinfo.lDiskOffset;
- }
-
- return MMSYSERR_NOERROR;
-}
-
-/**************************************************************************
- * mmioStringToFOURCC [MMSYSTEM.1220]
- */
-FOURCC WINAPI mmioStringToFOURCC16(LPCSTR sz, UINT16 uFlags)
-{
- return mmioStringToFOURCCA(sz, uFlags);
-}
-
-/**************************************************************************
- * mmioInstallIOProc [MMSYSTEM.1221]
- */
-LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC fccIOProc, LPMMIOPROC16 pIOProc,
- DWORD dwFlags)
-{
- return (LPMMIOPROC16)MMIO_InstallIOProc(fccIOProc, (LPMMIOPROC)pIOProc,
- dwFlags, MMIO_PROC_16);
-}
-
-/**************************************************************************
- * mmioSendMessage [MMSYSTEM.1222]
- */
-LRESULT WINAPI mmioSendMessage16(HMMIO16 hmmio, UINT16 uMessage,
- LPARAM lParam1, LPARAM lParam2)
-{
- return MMIO_SendMessage(HMMIO_32(hmmio), uMessage,
- lParam1, lParam2, MMIO_PROC_16);
-}
-
-/**************************************************************************
- * mmioDescend [MMSYSTEM.1223]
- */
-MMRESULT16 WINAPI mmioDescend16(HMMIO16 hmmio, LPMMCKINFO lpck,
- const MMCKINFO* lpckParent, UINT16 uFlags)
-{
- return mmioDescend(HMMIO_32(hmmio), lpck, lpckParent, uFlags);
-}
-
-/**************************************************************************
- * mmioAscend [MMSYSTEM.1224]
- */
-MMRESULT16 WINAPI mmioAscend16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags)
-{
- return mmioAscend(HMMIO_32(hmmio),lpck,uFlags);
-}
-
-/**************************************************************************
- * mmioCreateChunk [MMSYSTEM.1225]
- */
-MMRESULT16 WINAPI mmioCreateChunk16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags)
-{
- return mmioCreateChunk(HMMIO_32(hmmio), lpck, uFlags);
-}
-
-/**************************************************************************
- * mmioRename [MMSYSTEM.1226]
- */
-MMRESULT16 WINAPI mmioRename16(LPCSTR szFileName, LPCSTR szNewFileName,
- MMIOINFO16* lpmmioinfo, DWORD dwRenameFlags)
-{
- BOOL inst = FALSE;
- MMRESULT ret;
- MMIOINFO mmioinfo;
-
- if (lpmmioinfo != NULL && lpmmioinfo->pIOProc != NULL &&
- lpmmioinfo->fccIOProc == 0) {
- FIXME("Can't handle this case yet\n");
- return MMSYSERR_ERROR;
- }
-
- /* this is a bit hacky, but it'll work if we get a fourCC code or nothing.
- * but a non installed ioproc without a fourcc won't do
- */
- if (lpmmioinfo && lpmmioinfo->fccIOProc && lpmmioinfo->pIOProc) {
- MMIO_InstallIOProc(lpmmioinfo->fccIOProc, (LPMMIOPROC)lpmmioinfo->pIOProc,
- MMIO_INSTALLPROC, MMIO_PROC_16);
- inst = TRUE;
- }
- memset(&mmioinfo, 0, sizeof(mmioinfo));
- mmioinfo.fccIOProc = lpmmioinfo->fccIOProc;
- ret = mmioRenameA(szFileName, szNewFileName, &mmioinfo, dwRenameFlags);
- if (inst) {
- MMIO_InstallIOProc(lpmmioinfo->fccIOProc, NULL,
- MMIO_REMOVEPROC, MMIO_PROC_16);
- }
- return ret;
-}
-
-/* ###################################################
* # JOYSTICK #
* ###################################################
*/
More information about the wine-patches
mailing list