splitting msvideo/msvfw32

Eric Pouech eric.pouech at wanadoo.fr
Wed Oct 30 14:14:53 CST 2002


this patch shall split the 16 bit code out of msvfw32
A+
-------------- next part --------------
Name:          vfw1632
ChangeLog:     split between 16 / 32 bit code
License:       X11
GenDate:       2002/10/30 20:08:12 UTC
ModifiedFiles: include/vfw.h dlls/msvideo/Makefile.in dlls/msvideo/drawdib.c dlls/msvideo/msvideo16.c dlls/msvideo/msvideo_main.c dlls/msvideo/msvideo.spec dlls/msvideo/vfw16.h
AddedFiles:    dlls/msvideo/msvideo_private.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/include/vfw.h,v
retrieving revision 1.30
diff -u -u -r1.30 vfw.h
--- include/vfw.h	21 Oct 2002 23:39:20 -0000	1.30
+++ include/vfw.h	29 Oct 2002 17:31:18 -0000
@@ -47,23 +47,6 @@
 
 DECLARE_HANDLE(HIC);
 
-#ifdef __WINE__
-/* HIC struct (same layout as Win95 one) */
-typedef struct tagWINE_HIC {
-	DWORD		magic;		/* 00: 'Smag' */
-	HANDLE		curthread;	/* 04: */
-	DWORD		type;		/* 08: */
-	DWORD		handler;	/* 0C: */
-	HDRVR		hdrv;		/* 10: */
-	DWORD		private;	/* 14:(handled by SendDriverMessage)*/
-	FARPROC		driverproc;	/* 18:(handled by SendDriverMessage)*/
-	DWORD		x1;		/* 1c: name? */
-	WORD		x2;		/* 20: */
-	DWORD		x3;		/* 22: */
-					/* 26: */
-} WINE_HIC;
-#endif
-
 /* error return codes */
 #define	ICERR_OK		0
 #define	ICERR_DONTDRAW		1
Index: dlls/msvideo/Makefile.in
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/msvideo/Makefile.in,v
retrieving revision 1.22
diff -u -u -r1.22 Makefile.in
--- dlls/msvideo/Makefile.in	23 Oct 2002 23:33:21 -0000	1.22
+++ dlls/msvideo/Makefile.in	30 Oct 2002 17:58:12 -0000
@@ -17,7 +17,7 @@
 C_SRCS16 = \
 	msvideo16.c
 
-EXTRA_OBJS = $(MODULE).glue.o
+EXTRA_OBJS16 = $(MODULE).glue.o
 
 @MAKE_DLL_RULES@
 
Index: dlls/msvideo/drawdib.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/msvideo/drawdib.c,v
retrieving revision 1.16
diff -u -u -r1.16 drawdib.c
--- dlls/msvideo/drawdib.c	23 Oct 2002 23:33:21 -0000	1.16
+++ dlls/msvideo/drawdib.c	29 Oct 2002 17:46:10 -0000
@@ -28,7 +28,7 @@
 #include "wine/winbase16.h"
 #include "wine/debug.h"
 #include "vfw.h"
-#include "vfw16.h"
+#include "msvideo_private.h"
 #include "windef.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msvideo);
Index: dlls/msvideo/msvideo16.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/msvideo/msvideo16.c,v
retrieving revision 1.4
diff -u -u -r1.4 msvideo16.c
--- dlls/msvideo/msvideo16.c	23 Oct 2002 23:33:21 -0000	1.4
+++ dlls/msvideo/msvideo16.c	30 Oct 2002 17:41:33 -0000
@@ -19,15 +19,24 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <stdio.h>
+#include <string.h>
+
 #include "winbase.h"
 #include "windef.h"
+#include "winver.h"
 #include "vfw.h"
 #include "vfw16.h"
+#include "msvideo_private.h"
 #include "stackframe.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msvideo);
 
+/* ### start build ### */
+extern LONG CALLBACK MSVIDEO_CallTo16_long_lwwll(FARPROC16, LONG, WORD, WORD, LONG, LONG);
+/* ### stop build ### */
+
 /***********************************************************************
  *		DrawDibOpen		[MSVIDEO.102]
  */
@@ -156,7 +165,8 @@
 
     TRACE("0x%08lx, %u, %u, ...)\n", (DWORD) hic, msg, cb);
 
-    for (i = 0; i < cb / sizeof(WORD); i++) {
+    for (i = 0; i < cb / sizeof(WORD); i++) 
+    {
 	lpData[i] = VA_ARG16(valist, WORD);
     }
 
@@ -202,11 +212,10 @@
 			   DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev,
 			   LPVOID lpPrev)
 {
-
     DWORD ret;
     ICCOMPRESS iccmp;
     SEGPTR seg_iccmp;
-
+    
     TRACE("(0x%08lx,%ld,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags,
 	  lpbiOutput, lpData, lpbiInput, lpBits);
 
@@ -341,4 +350,541 @@
 {
     return HIC_16(ICGetDisplayFormat(HIC_32(hic), lpbiIn, lpbiOut, depth,
 				     dx, dy));
+}
+
+#define COPY(x,y) (x->y = x##16->y);
+#define COPYPTR(x,y) (x->y = MapSL((SEGPTR)x##16->y));
+
+/******************************************************************
+ *		MSVIDEO_MapICDEX16To32
+ *
+ *
+ */
+static LPVOID MSVIDEO_MapICDEX16To32(LPDWORD lParam) 
+{
+    LPVOID ret;
+
+    ICDECOMPRESSEX *icdx = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESSEX));
+    ICDECOMPRESSEX16 *icdx16 = MapSL(*lParam);
+    ret = icdx16;
+
+    COPY(icdx, dwFlags);
+    COPYPTR(icdx, lpbiSrc);
+    COPYPTR(icdx, lpSrc);
+    COPYPTR(icdx, lpbiDst);
+    COPYPTR(icdx, lpDst);
+    COPY(icdx, xDst);
+    COPY(icdx, yDst);
+    COPY(icdx, dxDst);
+    COPY(icdx, dyDst);
+    COPY(icdx, xSrc);
+    COPY(icdx, ySrc);
+    COPY(icdx, dxSrc);
+    COPY(icdx, dySrc);
+
+    *lParam = (DWORD)(icdx);
+    return ret;
+}
+
+/******************************************************************
+ *		MSVIDEO_MapMsg16To32
+ *
+ *
+ */
+static LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2)
+{
+    LPVOID ret = 0;
+
+    TRACE("Mapping %d\n", msg);
+
+    switch (msg) 
+    {
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case ICM_ABOUT:
+    case ICM_CONFIGURE:
+    case ICM_COMPRESS_END:
+    case ICM_DECOMPRESS_END:
+    case ICM_DECOMPRESSEX_END:
+    case ICM_SETQUALITY:
+    case ICM_DRAW_START_PLAY:
+    case ICM_DRAW_STOP_PLAY:
+    case ICM_DRAW_REALIZE:
+    case ICM_DRAW_RENDERBUFFER:
+    case ICM_DRAW_END:
+        break;
+    case DRV_OPEN:
+    case ICM_GETDEFAULTQUALITY:
+    case ICM_GETQUALITY:
+    case ICM_SETSTATE:
+    case ICM_DRAW_WINDOW:
+    case ICM_GETBUFFERSWANTED:
+        *lParam1 = (DWORD)MapSL(*lParam1);
+        break;
+    case ICM_GETINFO:
+        {
+            ICINFO *ici = HeapAlloc(GetProcessHeap(), 0, sizeof(ICINFO));
+            ICINFO16 *ici16;
+            
+            ici16 = MapSL(*lParam1);
+            ret = ici16;
+            
+            ici->dwSize = sizeof(ICINFO);
+            COPY(ici, fccType);
+            COPY(ici, fccHandler);
+            COPY(ici, dwFlags);
+            COPY(ici, dwVersion);
+            COPY(ici, dwVersionICM);
+            MultiByteToWideChar( CP_ACP, 0, ici16->szName, -1, ici->szName, 16 );
+            MultiByteToWideChar( CP_ACP, 0, ici16->szDescription, -1, ici->szDescription, 128 );
+            MultiByteToWideChar( CP_ACP, 0, ici16->szDriver, -1, ici->szDriver, 128 );
+            *lParam1 = (DWORD)(ici);
+            *lParam2 = sizeof(ICINFO);
+        }
+        break;
+    case ICM_COMPRESS:
+        {
+            ICCOMPRESS *icc = HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS));
+            ICCOMPRESS *icc16;
+
+            icc16 = MapSL(*lParam1);
+            ret = icc16;
+
+            COPY(icc, dwFlags);
+            COPYPTR(icc, lpbiOutput);
+            COPYPTR(icc, lpOutput);
+            COPYPTR(icc, lpbiInput);
+            COPYPTR(icc, lpInput);
+            COPYPTR(icc, lpckid);
+            COPYPTR(icc, lpdwFlags);
+            COPY(icc, lFrameNum);
+            COPY(icc, dwFrameSize);
+            COPY(icc, dwQuality);
+            COPYPTR(icc, lpbiPrev);
+            COPYPTR(icc, lpPrev);
+
+            *lParam1 = (DWORD)(icc);
+            *lParam2 = sizeof(ICCOMPRESS);
+        }
+        break;
+    case ICM_DECOMPRESS:
+        {
+            ICDECOMPRESS *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS));
+            ICDECOMPRESS *icd16; /* Same structure except for the pointers */
+
+            icd16 = MapSL(*lParam1);
+            ret = icd16;
+
+            COPY(icd, dwFlags);
+            COPYPTR(icd, lpbiInput);
+            COPYPTR(icd, lpInput);
+            COPYPTR(icd, lpbiOutput);
+            COPYPTR(icd, lpOutput);
+            COPY(icd, ckid);
+
+            *lParam1 = (DWORD)(icd);
+            *lParam2 = sizeof(ICDECOMPRESS);
+        }
+        break;
+    case ICM_COMPRESS_BEGIN:
+    case ICM_COMPRESS_GET_FORMAT:
+    case ICM_COMPRESS_GET_SIZE:
+    case ICM_COMPRESS_QUERY:
+    case ICM_DECOMPRESS_GET_FORMAT:
+    case ICM_DECOMPRESS_QUERY:
+    case ICM_DECOMPRESS_BEGIN:
+    case ICM_DECOMPRESS_SET_PALETTE:
+    case ICM_DECOMPRESS_GET_PALETTE:
+        *lParam1 = (DWORD)MapSL(*lParam1);
+        *lParam2 = (DWORD)MapSL(*lParam2);
+        break;
+    case ICM_DECOMPRESSEX_QUERY:
+        if ((*lParam2 != sizeof(ICDECOMPRESSEX16)) && (*lParam2 != 0))
+            WARN("*lParam2 has unknown value %p\n", (ICDECOMPRESSEX16*)*lParam2);
+        /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16)
+         * This is because of ICMessage(). Special case it?
+         {
+         LPVOID* addr = HeapAlloc(GetProcessHeap(), 0, 2*sizeof(LPVOID));
+         addr[0] = MSVIDEO_MapICDEX16To32(lParam1);
+         if (*lParam2)
+         addr[1] = MSVIDEO_MapICDEX16To32(lParam2);
+         else
+         addr[1] = 0;
+         
+         ret = addr;
+         }
+         break;*/
+    case ICM_DECOMPRESSEX_BEGIN:
+    case ICM_DECOMPRESSEX:
+        ret = MSVIDEO_MapICDEX16To32(lParam1);
+        *lParam2 = sizeof(ICDECOMPRESSEX);
+        break;
+    case ICM_DRAW_BEGIN:
+        {
+            ICDRAWBEGIN *icdb = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN));
+            ICDRAWBEGIN16 *icdb16 = MapSL(*lParam1);
+            ret = icdb16;
+
+            COPY(icdb, dwFlags);
+            icdb->hpal = HPALETTE_32(icdb16->hpal);
+            icdb->hwnd = HWND_32(icdb16->hwnd);
+            icdb->hdc = HDC_32(icdb16->hdc);
+            COPY(icdb, xDst);
+            COPY(icdb, yDst);
+            COPY(icdb, dxDst);
+            COPY(icdb, dyDst);
+            COPYPTR(icdb, lpbi);
+            COPY(icdb, xSrc);
+            COPY(icdb, ySrc);
+            COPY(icdb, dxSrc);
+            COPY(icdb, dySrc);
+            COPY(icdb, dwRate);
+            COPY(icdb, dwScale);
+
+            *lParam1 = (DWORD)(icdb);
+            *lParam2 = sizeof(ICDRAWBEGIN);
+        }
+        break;
+    case ICM_DRAW_SUGGESTFORMAT:
+        {
+            ICDRAWSUGGEST *icds = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWSUGGEST));
+            ICDRAWSUGGEST16 *icds16 = MapSL(*lParam1);
+
+            ret = icds16;
+
+            COPY(icds, dwFlags);
+            COPYPTR(icds, lpbiIn);
+            COPYPTR(icds, lpbiSuggest);
+            COPY(icds, dxSrc);
+            COPY(icds, dySrc);
+            COPY(icds, dxDst);
+            COPY(icds, dyDst);
+            icds->hicDecompressor = HIC_32(icds16->hicDecompressor);
+
+            *lParam1 = (DWORD)(icds);
+            *lParam2 = sizeof(ICDRAWSUGGEST);
+        }
+        break;
+    case ICM_DRAW:
+        {
+            ICDRAW *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAW));
+            ICDRAW *icd16 = MapSL(*lParam1);
+            ret = icd16;
+
+            COPY(icd, dwFlags);
+            COPYPTR(icd, lpFormat);
+            COPYPTR(icd, lpData);
+            COPY(icd, cbData);
+            COPY(icd, lTime);
+
+            *lParam1 = (DWORD)(icd);
+            *lParam2 = sizeof(ICDRAW);
+        }
+        break;
+    case ICM_DRAW_START:
+    case ICM_DRAW_STOP:
+        break;
+    default:
+        FIXME("%d is not yet handled. Expect a crash.\n", msg);
+    }
+    return ret;
+}
+
+#undef COPY
+#undef COPYPTR
+
+/******************************************************************
+ *		MSVIDEO_UnmapMsg16To32
+ *
+ *
+ */
+static void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID data16, LPDWORD lParam1, LPDWORD lParam2)
+{
+    TRACE("Unmapping %d\n", msg);
+
+#define UNCOPY(x, y) (x##16->y = x->y);
+
+    switch (msg) 
+    {
+    case ICM_GETINFO:
+        {
+            ICINFO *ici = (ICINFO*)(*lParam1);
+            ICINFO16 *ici16 = (ICINFO16*)data16;
+
+            UNCOPY(ici, fccType);
+            UNCOPY(ici, fccHandler);
+            UNCOPY(ici, dwFlags);
+            UNCOPY(ici, dwVersion);
+            UNCOPY(ici, dwVersionICM);
+            WideCharToMultiByte( CP_ACP, 0, ici->szName, -1, ici16->szName, 
+                                 sizeof(ici16->szName), NULL, NULL );
+            ici16->szName[sizeof(ici16->szName)-1] = 0;
+            WideCharToMultiByte( CP_ACP, 0, ici->szDescription, -1, ici16->szDescription, 
+                                 sizeof(ici16->szDescription), NULL, NULL );
+            ici16->szDescription[sizeof(ici16->szDescription)-1] = 0;
+            /* This just gives garbage for some reason - BB
+               lstrcpynWtoA(ici16->szDriver, ici->szDriver, 128);*/
+
+            HeapFree(GetProcessHeap(), 0, ici);
+        }
+        break;
+    case ICM_DECOMPRESS_QUERY:
+        /*{
+          LPVOID* x = data16;
+          HeapFree(GetProcessHeap(), 0, x[0]);
+          if (x[1])
+          HeapFree(GetProcessHeap(), 0, x[1]);
+          }
+          break;*/
+    case ICM_COMPRESS:
+    case ICM_DECOMPRESS:
+    case ICM_DECOMPRESSEX_QUERY:
+    case ICM_DECOMPRESSEX_BEGIN:
+    case ICM_DECOMPRESSEX:
+    case ICM_DRAW_BEGIN:
+    case ICM_DRAW_SUGGESTFORMAT:
+    case ICM_DRAW:
+        HeapFree(GetProcessHeap(), 0, data16);
+        break;
+    default:
+        ERR("Unmapping unmapped msg %d\n", msg);
+    }
+#undef UNCOPY
+}
+
+/***********************************************************************
+ *		ICInfo				[MSVIDEO.200]
+ */
+BOOL16 VFWAPI ICInfo16(DWORD fccType, DWORD fccHandler, ICINFO16 *lpicinfo)
+{
+    BOOL16 ret;
+    LPVOID lpv;
+    DWORD lParam = (DWORD)lpicinfo;
+    DWORD size = ((ICINFO*)(MapSL((SEGPTR)lpicinfo)))->dwSize;
+    
+    /* Use the mapping functions to map the ICINFO structure */
+    lpv = MSVIDEO_MapMsg16To32(ICM_GETINFO, &lParam, &size);
+
+    ret = ICInfo(fccType, fccHandler, (ICINFO*)lParam);
+
+    MSVIDEO_UnmapMsg16To32(ICM_GETINFO, lpv, &lParam, &size);
+
+    return ret;
+}
+
+/******************************************************************
+ *		IC_Callback3216
+ *
+ *
+ */
+static  LRESULT CALLBACK  IC_Callback3216(HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2)
+{
+    WINE_HIC*   whic;
+    LRESULT     ret = 0;
+
+    whic = GlobalLock16(HIC_16(hic));
+    if (whic)
+    {
+        switch (msg)
+        {
+        case DRV_OPEN:
+            lp2 = (DWORD)MapLS((void*)lp2);
+            break;
+        }
+
+        ret = MSVIDEO_CallTo16_long_lwwll((FARPROC16)whic->driverproc16, 
+                                          HIC_16(hic), HDRVR_16(whic->hdrv), msg, lp1, lp2);
+        switch (msg)
+        {
+        case DRV_OPEN:
+            UnMapLS(lp2);
+            break;
+        }
+        GlobalUnlock16(HIC_16(hic));
+    }
+    else ret = MMSYSERR_ERROR;
+    return ret;
+}
+
+/***********************************************************************
+ *		ICOpenFunction			[MSVIDEO.206]
+ */
+HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler)
+{
+    HIC         hic32;
+
+    hic32 = MSVIDEO_OpenFunction(fccType, fccHandler, wMode, 
+                                 (DRIVERPROC)IC_Callback3216, (DRIVERPROC16)lpfnHandler);
+    return HIC_16(hic32);
+}
+
+/***********************************************************************
+ *		ICSendMessage			[MSVIDEO.205]
+ */
+LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2) 
+{
+    LRESULT     ret = MMSYSERR_ERROR;
+    WINE_HIC*   whic;
+
+    whic = GlobalLock16(hic);
+    if (whic)
+    {
+        /* we've got a 16 bit driver proc... call it directly */
+        if (whic->driverproc16)
+        {
+            ret = MSVIDEO_CallTo16_long_lwwll((FARPROC16)whic->driverproc16, 
+                                              (LONG)whic->hdrv, HIC_16(hic), msg, lParam1, lParam2);
+        }
+        else
+        {
+            /* map the message for a 32 bit infrastructure, and pass it along */
+            void*       data16 = MSVIDEO_MapMsg16To32(msg, &lParam1, &lParam2);
+    
+            ret = MSVIDEO_SendMessage(HIC_32(hic), msg, lParam1, lParam2);
+            if (data16)
+                MSVIDEO_UnmapMsg16To32(msg, data16, &lParam1, &lParam2);
+        }
+        GlobalUnlock16(hic);
+    }
+    return ret;
+}
+
+/***********************************************************************
+ *		VideoCapDriverDescAndVer	[MSVIDEO.22]
+ */
+DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len,
+                                        LPSTR buf2, WORD buf2len)
+{
+    DWORD	verhandle;
+    WORD	xnr = nr;
+    DWORD	infosize;
+    UINT	subblocklen;
+    char	*s,  buf[2000],  fn[260];
+    LPBYTE	infobuf;
+    LPVOID	subblock;
+
+    TRACE("(%d,%p,%d,%p,%d)\n", nr, buf1, buf1len, buf2, buf2len);
+    if (GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini")) 
+    {
+        s = buf;
+        while (*s) 
+        {
+            if (!strncasecmp(s, "vid", 3)) 
+            {
+                if (!xnr) break;
+                xnr--;
+            }
+            s = s + strlen(s) + 1; /* either next char or \0 */
+        }
+    }
+    else
+        return 20; /* hmm, out of entries even if we don't have any */
+    if (xnr) 
+    {
+        FIXME("No more VID* entries found\n");
+        return 20;
+    }
+    GetPrivateProfileStringA("drivers32", s, NULL, fn, sizeof(fn), "system.ini");
+    infosize = GetFileVersionInfoSizeA(fn, &verhandle);
+    if (!infosize) 
+    {
+        TRACE("%s has no fileversioninfo.\n", fn);
+        return 18;
+    }
+    infobuf = HeapAlloc(GetProcessHeap(), 0, infosize);
+    if (GetFileVersionInfoA(fn, verhandle, infosize, infobuf)) 
+    {
+        char	vbuf[200];
+        /* Yes, two space behind : */
+        /* FIXME: test for buflen */
+        sprintf(vbuf, "Version:  %d.%d.%d.%d\n", 
+                ((WORD*)infobuf)[0x0f],
+                ((WORD*)infobuf)[0x0e],
+                ((WORD*)infobuf)[0x11],
+                ((WORD*)infobuf)[0x10]
+	    );
+        TRACE("version of %s is %s\n", fn, vbuf);
+        strncpy(buf2, vbuf, buf2len);
+    }
+    else 
+    {
+        TRACE("GetFileVersionInfoA failed for %s.\n", fn);
+        strncpy(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/
+    }
+    /* FIXME: language problem? */
+    if (VerQueryValueA(	infobuf,
+                        "\\StringFileInfo\\040904E4\\FileDescription",
+                        &subblock,
+                        &subblocklen
+            )) 
+    {
+        TRACE("VQA returned %s\n", (LPCSTR)subblock);
+        strncpy(buf1, subblock, buf1len);
+    }
+    else 
+    {
+        TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n");
+        strncpy(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/
+    }
+    HeapFree(GetProcessHeap(), 0, infobuf);
+    return 0;
+}
+
+/******************************************************************
+ *		IC_CallTo16
+ *
+ *
+ */
+static  LRESULT CALLBACK IC_CallTo16(HDRVR hdrv, HIC hic, UINT msg, LPARAM lp1, LPARAM lp2)
+{
+#if 0
+    WINE_HIC*   whic = GlobalLock16(HIC_16(hic));
+    LRESULT     ret = 0;
+    
+    
+    if (whic->driverproc) 
+    {
+        ret = whic->driverproc(hic, whic->hdrv, msg, lParam1, lParam2);
+    }
+    else
+    {
+        ret = SendDriverMessage(whic->hdrv, msg, lParam1, lParam2);
+    }
+#else
+    FIXME("No 32=>16 conversion yet\n");
+#endif
+    return 0;
+}
+
+/**************************************************************************
+ *                      DllEntryPoint (MSVIDEO.2046)
+ *
+ * MSVIDEO DLL entry point
+ *
+ */
+BOOL WINAPI VIDEO_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds,
+                          WORD wHeapSize, DWORD dwReserved1, WORD wReserved2)
+{
+    switch (fdwReason) 
+    {
+    case DLL_PROCESS_ATTACH:
+        if (!GetModuleHandleA("MSVFW32.DLL") && !LoadLibraryA("MSVFW32.DLL"))
+        {
+            ERR("Could not load sibling MSVfW32.dll\n");
+            return FALSE;
+        }
+        /* hook in our 16 bit management functions */
+        pFnCallTo16 = IC_CallTo16;
+        break;
+    case DLL_PROCESS_DETACH:
+        /* remove our 16 bit management functions */
+        break;
+    case DLL_THREAD_ATTACH:
+    case DLL_THREAD_DETACH:
+        break;
+    }
+    return TRUE;
 }
Index: dlls/msvideo/msvideo_main.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/msvideo/msvideo_main.c,v
retrieving revision 1.40
diff -u -u -r1.40 msvideo_main.c
--- dlls/msvideo/msvideo_main.c	23 Oct 2002 23:33:21 -0000	1.40
+++ dlls/msvideo/msvideo_main.c	30 Oct 2002 17:40:06 -0000
@@ -26,28 +26,16 @@
 
 #include "winbase.h"
 #include "windef.h"
-#include "winnls.h"
 #include "wingdi.h"
 #include "winuser.h"
-#include "winver.h"
 #include "vfw.h"
-#include "vfw16.h"
 #include "wine/winbase16.h"
 #include "wine/debug.h"
-#include "stackframe.h"
+#include "msvideo_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msvideo);
 
-/* ### start build ### */
-extern LONG CALLBACK MSVIDEO_CallTo16_long_lwwll(FARPROC16,LONG,WORD,WORD,LONG,LONG);
-/* ### stop build ### */
-
-LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2);
-void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID lpv, LPDWORD lParam1, LPDWORD lParam2);
-LRESULT MSVIDEO_SendMessage(HIC hic, UINT msg, DWORD lParam1, DWORD lParam2, BOOL bFrom32);
-
-#define HDRVR_16(h32)		(LOWORD(h32))
-
+LRESULT  (CALLBACK *pFnCallTo16)(HDRVR, HIC, UINT, LPARAM, LPARAM) /* = NULL */;
 
 /***********************************************************************
  *		VideoForWindowsVersion		[MSVFW32.2]
@@ -55,78 +43,9 @@
  * Returns the version in major.minor form.
  * In Windows95 this returns 0x040003b6 (4.950)
  */
-DWORD WINAPI VideoForWindowsVersion(void) {
-	return 0x040003B6; /* 4.950 */
-}
-
-/***********************************************************************
- *		VideoCapDriverDescAndVer	[MSVIDEO.22]
- */
-DWORD WINAPI VideoCapDriverDescAndVer(
-	WORD nr,LPSTR buf1,WORD buf1len,LPSTR buf2,WORD buf2len
-) {
-	DWORD	verhandle;
-	WORD	xnr = nr;
-	DWORD	infosize;
-	UINT	subblocklen;
-	char	*s,buf[2000],fn[260];
-	LPBYTE	infobuf;
-	LPVOID	subblock;
-
-	TRACE("(%d,%p,%d,%p,%d)\n",nr,buf1,buf1len,buf2,buf2len);
-	if (GetPrivateProfileStringA("drivers32",NULL,NULL,buf,sizeof(buf),"system.ini")) {
-		s = buf;
-		while (*s) {
-		        if (!strncasecmp(s,"vid",3)) {
-			    if (!xnr)
-				break;
-			    xnr--;
-			}
-			s=s+strlen(s)+1; /* either next char or \0 */
-		}
-	} else
-	    return 20; /* hmm, out of entries even if we don't have any */
-	if (xnr) {
-		FIXME("No more VID* entries found\n");
-		return 20;
-	}
-	GetPrivateProfileStringA("drivers32",s,NULL,fn,sizeof(fn),"system.ini");
-	infosize = GetFileVersionInfoSizeA(fn,&verhandle);
-	if (!infosize) {
-	    TRACE("%s has no fileversioninfo.\n",fn);
-	    return 18;
-	}
-	infobuf = HeapAlloc(GetProcessHeap(),0,infosize);
-	if (GetFileVersionInfoA(fn,verhandle,infosize,infobuf)) {
-	    char	vbuf[200];
-	    /* Yes, two space behind : */
-	    /* FIXME: test for buflen */
-	    sprintf(vbuf,"Version:  %d.%d.%d.%d\n",
-		    ((WORD*)infobuf)[0x0f],
-		    ((WORD*)infobuf)[0x0e],
-		    ((WORD*)infobuf)[0x11],
-		    ((WORD*)infobuf)[0x10]
-	    );
-	    TRACE("version of %s is %s\n",fn,vbuf);
-	    strncpy(buf2,vbuf,buf2len);
-	} else {
-	    TRACE("GetFileVersionInfoA failed for %s.\n",fn);
-	    strncpy(buf2,fn,buf2len); /* msvideo.dll appears to copy fn*/
-	}
-	/* FIXME: language problem? */
-	if (VerQueryValueA(	infobuf,
-				"\\StringFileInfo\\040904E4\\FileDescription",
-				&subblock,
-				&subblocklen
-	)) {
-	    TRACE("VQA returned %s\n",(LPCSTR)subblock);
-	    strncpy(buf1,subblock,buf1len);
-	} else {
-	    TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n");
-	    strncpy(buf1,fn,buf1len); /* msvideo.dll appears to copy fn*/
-	}
-	HeapFree(GetProcessHeap(),0,infobuf);
-	return 0;
+DWORD WINAPI VideoForWindowsVersion(void) 
+{
+    return 0x040003B6; /* 4.950 */
 }
 
 /* system.ini: [drivers] */
@@ -165,29 +84,6 @@
 }
 
 /***********************************************************************
- *		ICInfo				[MSVIDEO.200]
- */
-BOOL16 VFWAPI ICInfo16(
-	DWORD     fccType,    /* [in] */
-	DWORD     fccHandler, /* [in] */
-	ICINFO16 *lpicinfo)   /* [in/out] NOTE: SEGPTR */
-{
-	BOOL16 ret;
-	LPVOID lpv;
-	DWORD lParam = (DWORD)lpicinfo;
-	DWORD size = ((ICINFO*)(MapSL((SEGPTR)lpicinfo)))->dwSize;
-
-	/* Use the mapping functions to map the ICINFO structure */
-	lpv = MSVIDEO_MapMsg16To32(ICM_GETINFO,&lParam,&size);
-
-	ret = ICInfo(fccType,fccHandler,(ICINFO*)lParam);
-
-	MSVIDEO_UnmapMsg16To32(ICM_GETINFO,lpv,&lParam,&size);
-
-	return ret;
-}
-
-/***********************************************************************
  *		ICOpen				[MSVFW32.@]
  * Opens an installable compressor. Return special handle.
  */
@@ -197,6 +93,7 @@
 	HDRVR		hdrv;
 	HIC		hic;
 	WINE_HIC	*whic;
+        BOOL            bIs16;
 
 	memcpy(type,&fccType,4);type[4]=0;
 	memcpy(handler,&fccHandler,4);handler[4]=0;
@@ -207,11 +104,16 @@
 	/* Well, lParam2 is in fact a LPVIDEO_OPEN_PARMS, but it has the
 	 * same layout as ICOPEN
 	 */
+	icopen.dwSize		= sizeof(ICOPEN);
 	icopen.fccType		= fccType;
 	icopen.fccHandler	= fccHandler;
-	icopen.dwSize		= sizeof(ICOPEN);
+        icopen.dwVersion        = 0x00001000; /* FIXME */
 	icopen.dwFlags		= wMode;
-	/* FIXME: do we need to fill out the rest too? */
+        icopen.dwError          = 0;
+        icopen.pV1Reserved      = NULL;
+        icopen.pV2Reserved      = NULL;
+        icopen.dnDevNode        = 0; /* FIXME */
+        
 	hdrv=OpenDriverA(codecname,"drivers32",(LPARAM)&icopen);
 	if (!hdrv) {
 	    if (!strcasecmp(type,"vids")) {
@@ -222,27 +124,40 @@
 	    if (!hdrv)
 		    return 0;
 	}
+        bIs16 = GetDriverFlags(hdrv) & WINE_GDF_16BIT;
+
+        if (bIs16 && !pFnCallTo16)
+        {
+            FIXME("Got a 16 bit driver, but no 16 bit support in msvfw\n");
+            return 0;
+        }
 	/* The handle should be a valid 16-bit handle as well */
 	hic = HIC_32(GlobalAlloc16(GHND,sizeof(WINE_HIC)));
 	whic = (WINE_HIC*)GlobalLock16(HIC_16(hic));
-	whic->hdrv	= hdrv;
-	whic->driverproc= NULL;
-	whic->private	= 0;
+	whic->hdrv	   = hdrv;
+        /* FIXME: is the signature the real one ? */
+	whic->driverproc   = bIs16 ? (DRIVERPROC)pFnCallTo16 : NULL;
+        whic->driverproc16 = NULL;
+
 	GlobalUnlock16(HIC_16(hic));
 	TRACE("=> %p\n",hic);
 	return HIC_32(hic);
 }
 
-HIC MSVIDEO_OpenFunc(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler, BOOL bFrom32) {
+/***********************************************************************
+ *		MSVIDEO_OpenFunction
+ */
+HIC MSVIDEO_OpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, 
+                         DRIVERPROC lpfnHandler, DRIVERPROC16 lpfnHandler16) 
+{
 	char	type[5],handler[5],codecname[20];
 	HIC	hic;
         ICOPEN icopen;
-        SEGPTR seg_icopen;
 	WINE_HIC	*whic;
 
 	memcpy(type,&fccType,4);type[4]=0;
 	memcpy(handler,&fccHandler,4);handler[4]=0;
-	TRACE("(%s,%s,%d,%p,%d)\n",type,handler,wMode,lpfnHandler,bFrom32?32:16);
+	TRACE("(%s,%s,%d,%p,%p)\n",type,handler,wMode,lpfnHandler,lpfnHandler16);
 
         icopen.fccType    = fccType;
         icopen.fccHandler = fccHandler;
@@ -255,24 +170,22 @@
 	if (!hic)
 		return 0;
 	whic = GlobalLock16(HIC_16(hic));
-	whic->driverproc = lpfnHandler;
-
-	whic->private = bFrom32;
+	whic->driverproc   = lpfnHandler;
+	whic->driverproc16 = lpfnHandler16;
 
 	/* Now try opening/loading the driver. Taken from DRIVER_AddToList */
 	/* What if the function is used more than once? */
 
-	if (MSVIDEO_SendMessage(hic,DRV_LOAD,0L,0L,bFrom32) != DRV_SUCCESS) {
+	if (MSVIDEO_SendMessage(hic,DRV_LOAD,0L,0L) != DRV_SUCCESS) {
 		WARN("DRV_LOAD failed for hic %p\n", hic);
 		GlobalFree16(HIC_16(hic));
 		return 0;
 	}
 	/* return value is not checked */
-	MSVIDEO_SendMessage(hic,DRV_ENABLE,0L,0L,bFrom32);
+	MSVIDEO_SendMessage(hic,DRV_ENABLE,0L,0L);
+
+        whic->hdrv = (HDRVR)MSVIDEO_SendMessage(hic,DRV_OPEN,0,(DWORD)&icopen);
 
-        seg_icopen = MapLS( &icopen );
-        whic->hdrv = (HDRVR)MSVIDEO_SendMessage(hic,DRV_OPEN,0,seg_icopen,FALSE);
-        UnMapLS( seg_icopen );
 	if (whic->hdrv == 0) {
 		WARN("DRV_OPEN failed for hic %p\n",hic);
 		GlobalFree16(HIC_16(hic));
@@ -287,16 +200,9 @@
 /***********************************************************************
  *		ICOpenFunction			[MSVFW32.@]
  */
-HIC VFWAPI ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler) {
-	return MSVIDEO_OpenFunc(fccType,fccHandler,wMode,lpfnHandler,TRUE);
-}
-
-/***********************************************************************
- *		ICOpenFunction			[MSVIDEO.206]
- */
-HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler)
+HIC VFWAPI ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler) 
 {
-	return HIC_16(MSVIDEO_OpenFunc(fccType, fccHandler, wMode, (FARPROC)lpfnHandler,FALSE));
+    return MSVIDEO_OpenFunction(fccType, fccHandler, wMode, (DRIVERPROC)lpfnHandler, NULL);
 }
 
 /***********************************************************************
@@ -508,412 +414,101 @@
 	return ret;
 }
 
-#define COPY(x,y) (x->y = x##16->y);
-#define COPYPTR(x,y) (x->y = MapSL((SEGPTR)x##16->y));
-
-LPVOID MSVIDEO_MapICDEX16To32(LPDWORD lParam) {
-	LPVOID ret;
-
-	ICDECOMPRESSEX *icdx = HeapAlloc(GetProcessHeap(),0,sizeof(ICDECOMPRESSEX));
-	ICDECOMPRESSEX16 *icdx16 = MapSL(*lParam);
-	ret = icdx16;
-
-	COPY(icdx,dwFlags);
-	COPYPTR(icdx,lpbiSrc);
-	COPYPTR(icdx,lpSrc);
-	COPYPTR(icdx,lpbiDst);
-	COPYPTR(icdx,lpDst);
-	COPY(icdx,xDst);
-	COPY(icdx,yDst);
-	COPY(icdx,dxDst);
-	COPY(icdx,dyDst);
-	COPY(icdx,xSrc);
-	COPY(icdx,ySrc);
-	COPY(icdx,dxSrc);
-	COPY(icdx,dySrc);
-
-	*lParam = (DWORD)(icdx);
-	return ret;
-}
-
-LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2) {
-	LPVOID ret = 0;
-
-	TRACE("Mapping %d\n",msg);
-
-	switch (msg) {
-	case DRV_LOAD:
-	case DRV_ENABLE:
-	case DRV_CLOSE:
-	case DRV_DISABLE:
-	case DRV_FREE:
-	case ICM_ABOUT:
-	case ICM_CONFIGURE:
-	case ICM_COMPRESS_END:
-	case ICM_DECOMPRESS_END:
-	case ICM_DECOMPRESSEX_END:
-	case ICM_SETQUALITY:
-	case ICM_DRAW_START_PLAY:
-	case ICM_DRAW_STOP_PLAY:
-	case ICM_DRAW_REALIZE:
-	case ICM_DRAW_RENDERBUFFER:
-	case ICM_DRAW_END:
-		break;
-	case DRV_OPEN:
-	case ICM_GETDEFAULTQUALITY:
-	case ICM_GETQUALITY:
-	case ICM_SETSTATE:
-	case ICM_DRAW_WINDOW:
-	case ICM_GETBUFFERSWANTED:
-		*lParam1 = (DWORD)MapSL(*lParam1);
-		break;
-	case ICM_GETINFO:
-		{
-			ICINFO *ici = HeapAlloc(GetProcessHeap(),0,sizeof(ICINFO));
-			ICINFO16 *ici16;
-
-			ici16 = MapSL(*lParam1);
-			ret = ici16;
-
-			ici->dwSize = sizeof(ICINFO);
-			COPY(ici,fccType);
-			COPY(ici,fccHandler);
-			COPY(ici,dwFlags);
-			COPY(ici,dwVersion);
-			COPY(ici,dwVersionICM);
-                        MultiByteToWideChar( CP_ACP, 0, ici16->szName, -1, ici->szName, 16 );
-                        MultiByteToWideChar( CP_ACP, 0, ici16->szDescription, -1, ici->szDescription, 128 );
-                        MultiByteToWideChar( CP_ACP, 0, ici16->szDriver, -1, ici->szDriver, 128 );
-			*lParam1 = (DWORD)(ici);
-			*lParam2 = sizeof(ICINFO);
-		}
-		break;
-	case ICM_COMPRESS:
-		{
-			ICCOMPRESS *icc = HeapAlloc(GetProcessHeap(),0,sizeof(ICCOMPRESS));
-			ICCOMPRESS *icc16;
-
-			icc16 = MapSL(*lParam1);
-			ret = icc16;
-
-			COPY(icc,dwFlags);
-			COPYPTR(icc,lpbiOutput);
-			COPYPTR(icc,lpOutput);
-			COPYPTR(icc,lpbiInput);
-			COPYPTR(icc,lpInput);
-			COPYPTR(icc,lpckid);
-			COPYPTR(icc,lpdwFlags);
-			COPY(icc,lFrameNum);
-			COPY(icc,dwFrameSize);
-			COPY(icc,dwQuality);
-			COPYPTR(icc,lpbiPrev);
-			COPYPTR(icc,lpPrev);
-
-			*lParam1 = (DWORD)(icc);
-			*lParam2 = sizeof(ICCOMPRESS);
-		}
-		break;
-	case ICM_DECOMPRESS:
-		{
-			ICDECOMPRESS *icd = HeapAlloc(GetProcessHeap(),0,sizeof(ICDECOMPRESS));
-			ICDECOMPRESS *icd16; /* Same structure except for the pointers */
-
-			icd16 = MapSL(*lParam1);
-			ret = icd16;
-
-			COPY(icd,dwFlags);
-			COPYPTR(icd,lpbiInput);
-			COPYPTR(icd,lpInput);
-			COPYPTR(icd,lpbiOutput);
-			COPYPTR(icd,lpOutput);
-			COPY(icd,ckid);
-
-			*lParam1 = (DWORD)(icd);
-			*lParam2 = sizeof(ICDECOMPRESS);
-		}
-		break;
-	case ICM_COMPRESS_BEGIN:
-	case ICM_COMPRESS_GET_FORMAT:
-	case ICM_COMPRESS_GET_SIZE:
-	case ICM_COMPRESS_QUERY:
-	case ICM_DECOMPRESS_GET_FORMAT:
-	case ICM_DECOMPRESS_QUERY:
-	case ICM_DECOMPRESS_BEGIN:
-	case ICM_DECOMPRESS_SET_PALETTE:
-	case ICM_DECOMPRESS_GET_PALETTE:
-		*lParam1 = (DWORD)MapSL(*lParam1);
-		*lParam2 = (DWORD)MapSL(*lParam2);
-		break;
-	case ICM_DECOMPRESSEX_QUERY:
-		if ((*lParam2 != sizeof(ICDECOMPRESSEX16)) && (*lParam2 != 0))
-			WARN("*lParam2 has unknown value %p\n",(ICDECOMPRESSEX16*)*lParam2);
-		/* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16)
-		 * This is because of ICMessage(). Special case it?
-		 {
-		 LPVOID* addr = HeapAlloc(GetProcessHeap(),0,2*sizeof(LPVOID));
-		 addr[0] = MSVIDEO_MapICDEX16To32(lParam1);
-		 if (*lParam2)
-		 addr[1] = MSVIDEO_MapICDEX16To32(lParam2);
-		 else
-		 addr[1] = 0;
-
-		 ret = addr;
-		 }
-		 break;*/
-	case ICM_DECOMPRESSEX_BEGIN:
-	case ICM_DECOMPRESSEX:
-		ret = MSVIDEO_MapICDEX16To32(lParam1);
-		*lParam2 = sizeof(ICDECOMPRESSEX);
-		break;
-	case ICM_DRAW_BEGIN:
-		{
-			ICDRAWBEGIN *icdb = HeapAlloc(GetProcessHeap(),0,sizeof(ICDRAWBEGIN));
-			ICDRAWBEGIN16 *icdb16 = MapSL(*lParam1);
-			ret = icdb16;
-
-			COPY(icdb,dwFlags);
-			icdb->hpal = HPALETTE_32(icdb16->hpal);
-			icdb->hwnd = HWND_32(icdb16->hwnd);
-			icdb->hdc = HDC_32(icdb16->hdc);
-			COPY(icdb,xDst);
-			COPY(icdb,yDst);
-			COPY(icdb,dxDst);
-			COPY(icdb,dyDst);
-			COPYPTR(icdb,lpbi);
-			COPY(icdb,xSrc);
-			COPY(icdb,ySrc);
-			COPY(icdb,dxSrc);
-			COPY(icdb,dySrc);
-			COPY(icdb,dwRate);
-			COPY(icdb,dwScale);
-
-			*lParam1 = (DWORD)(icdb);
-			*lParam2 = sizeof(ICDRAWBEGIN);
-		}
-		break;
-	case ICM_DRAW_SUGGESTFORMAT:
-		{
-			ICDRAWSUGGEST *icds = HeapAlloc(GetProcessHeap(),0,sizeof(ICDRAWSUGGEST));
-			ICDRAWSUGGEST16 *icds16 = MapSL(*lParam1);
-
-			ret = icds16;
-
-			COPY(icds,dwFlags);
-			COPYPTR(icds,lpbiIn);
-			COPYPTR(icds,lpbiSuggest);
-			COPY(icds,dxSrc);
-			COPY(icds,dySrc);
-			COPY(icds,dxDst);
-			COPY(icds,dyDst);
-			icds->hicDecompressor = HIC_32(icds16->hicDecompressor);
-
-			*lParam1 = (DWORD)(icds);
-			*lParam2 = sizeof(ICDRAWSUGGEST);
-		}
-		break;
-	case ICM_DRAW:
-		{
-			ICDRAW *icd = HeapAlloc(GetProcessHeap(),0,sizeof(ICDRAW));
-			ICDRAW *icd16 = MapSL(*lParam1);
-			ret = icd16;
-
-			COPY(icd,dwFlags);
-			COPYPTR(icd,lpFormat);
-			COPYPTR(icd,lpData);
-			COPY(icd,cbData);
-			COPY(icd,lTime);
-
-			*lParam1 = (DWORD)(icd);
-			*lParam2 = sizeof(ICDRAW);
-		}
-		break;
-	case ICM_DRAW_START:
-	case ICM_DRAW_STOP:
-		break;
-	default:
-		FIXME("%d is not yet handled. Expect a crash.\n",msg);
-	}
-	return ret;
-}
-
-#undef COPY
-#undef COPYPTR
-
-void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID data16, LPDWORD lParam1, LPDWORD lParam2) {
-	TRACE("Unmapping %d\n",msg);
-
-#define UNCOPY(x,y) (x##16->y = x->y);
-
-	switch (msg) {
-	case ICM_GETINFO:
-		{
-			ICINFO *ici = (ICINFO*)(*lParam1);
-			ICINFO16 *ici16 = (ICINFO16*)data16;
-
-			UNCOPY(ici,fccType);
-			UNCOPY(ici,fccHandler);
-			UNCOPY(ici,dwFlags);
-			UNCOPY(ici,dwVersion);
-			UNCOPY(ici,dwVersionICM);
-                        WideCharToMultiByte( CP_ACP, 0, ici->szName, -1, ici16->szName,
-                                             sizeof(ici16->szName), NULL, NULL );
-                        ici16->szName[sizeof(ici16->szName)-1] = 0;
-                        WideCharToMultiByte( CP_ACP, 0, ici->szDescription, -1, ici16->szDescription,
-                                             sizeof(ici16->szDescription), NULL, NULL );
-                        ici16->szDescription[sizeof(ici16->szDescription)-1] = 0;
-			/* This just gives garbage for some reason - BB
-			   lstrcpynWtoA(ici16->szDriver,ici->szDriver,128);*/
-
-			HeapFree(GetProcessHeap(),0,ici);
-		}
-		break;
-	case ICM_DECOMPRESS_QUERY:
-		/*{
-		  LPVOID* x = data16;
-		  HeapFree(GetProcessHeap(),0,x[0]);
-		  if (x[1])
-		  HeapFree(GetProcessHeap(),0,x[1]);
-		  }
-		  break;*/
-	case ICM_COMPRESS:
-	case ICM_DECOMPRESS:
-	case ICM_DECOMPRESSEX_QUERY:
-	case ICM_DECOMPRESSEX_BEGIN:
-	case ICM_DECOMPRESSEX:
-	case ICM_DRAW_BEGIN:
-	case ICM_DRAW_SUGGESTFORMAT:
-	case ICM_DRAW:
-		HeapFree(GetProcessHeap(),0,data16);
-		break;
-	default:
-		ERR("Unmapping unmapped msg %d\n",msg);
-	}
-#undef UNCOPY
-}
-
-LRESULT MSVIDEO_SendMessage(HIC hic,UINT msg,DWORD lParam1,DWORD lParam2, BOOL bFrom32) {
-	LRESULT		ret;
-	WINE_HIC	*whic = GlobalLock16(HIC_16(hic));
-	LPVOID data16 = 0;
-	BOOL bDrv32;
-
-#define XX(x) case x: TRACE("(%p,"#x",0x%08lx,0x%08lx,%d)\n",hic,lParam1,lParam2,bFrom32?32:16);break;
-
-	switch (msg) {
-		/* DRV_* */
-		XX(DRV_LOAD);
-		XX(DRV_ENABLE);
-		XX(DRV_OPEN);
-		XX(DRV_CLOSE);
-		XX(DRV_DISABLE);
-		XX(DRV_FREE);
-		/* ICM_RESERVED+X */
-		XX(ICM_ABOUT);
-		XX(ICM_CONFIGURE);
-		XX(ICM_GET);
-		XX(ICM_GETINFO);
-		XX(ICM_GETDEFAULTQUALITY);
-		XX(ICM_GETQUALITY);
-		XX(ICM_GETSTATE);
-		XX(ICM_SETQUALITY);
-		XX(ICM_SET);
-		XX(ICM_SETSTATE);
-		/* ICM_USER+X */
-		XX(ICM_COMPRESS_FRAMES_INFO);
-		XX(ICM_COMPRESS_GET_FORMAT);
-		XX(ICM_COMPRESS_GET_SIZE);
-		XX(ICM_COMPRESS_QUERY);
-		XX(ICM_COMPRESS_BEGIN);
-		XX(ICM_COMPRESS);
-		XX(ICM_COMPRESS_END);
-		XX(ICM_DECOMPRESS_GET_FORMAT);
-		XX(ICM_DECOMPRESS_QUERY);
-		XX(ICM_DECOMPRESS_BEGIN);
-		XX(ICM_DECOMPRESS);
-		XX(ICM_DECOMPRESS_END);
-		XX(ICM_DECOMPRESS_SET_PALETTE);
-		XX(ICM_DECOMPRESS_GET_PALETTE);
-		XX(ICM_DRAW_QUERY);
-		XX(ICM_DRAW_BEGIN);
-		XX(ICM_DRAW_GET_PALETTE);
-		XX(ICM_DRAW_START);
-		XX(ICM_DRAW_STOP);
-		XX(ICM_DRAW_END);
-		XX(ICM_DRAW_GETTIME);
-		XX(ICM_DRAW);
-		XX(ICM_DRAW_WINDOW);
-		XX(ICM_DRAW_SETTIME);
-		XX(ICM_DRAW_REALIZE);
-		XX(ICM_DRAW_FLUSH);
-		XX(ICM_DRAW_RENDERBUFFER);
-		XX(ICM_DRAW_START_PLAY);
-		XX(ICM_DRAW_STOP_PLAY);
-		XX(ICM_DRAW_SUGGESTFORMAT);
-		XX(ICM_DRAW_CHANGEPALETTE);
-		XX(ICM_GETBUFFERSWANTED);
-		XX(ICM_GETDEFAULTKEYFRAMERATE);
-		XX(ICM_DECOMPRESSEX_BEGIN);
-		XX(ICM_DECOMPRESSEX_QUERY);
-		XX(ICM_DECOMPRESSEX);
-		XX(ICM_DECOMPRESSEX_END);
-		XX(ICM_SET_STATUS_PROC);
-	default:
-		FIXME("(%p,0x%08lx,0x%08lx,0x%08lx,%i) unknown message\n",hic,(DWORD)msg,lParam1,lParam2,bFrom32?32:16);
-	}
-
+/******************************************************************
+ *		MSVIDEO_SendMessage
+ *
+ *
+ */
+LRESULT MSVIDEO_SendMessage(HIC hic,UINT msg,DWORD lParam1,DWORD lParam2)
+{
+    LRESULT     ret;
+    WINE_HIC*   whic = GlobalLock16(HIC_16(hic));
+    
+#define XX(x) case x: TRACE("(%p,"#x",0x%08lx,0x%08lx)\n",hic,lParam1,lParam2);break;
+    
+    switch (msg) {
+        /* DRV_* */
+        XX(DRV_LOAD);
+        XX(DRV_ENABLE);
+        XX(DRV_OPEN);
+        XX(DRV_CLOSE);
+        XX(DRV_DISABLE);
+        XX(DRV_FREE);
+        /* ICM_RESERVED+X */
+        XX(ICM_ABOUT);
+        XX(ICM_CONFIGURE);
+        XX(ICM_GET);
+        XX(ICM_GETINFO);
+        XX(ICM_GETDEFAULTQUALITY);
+        XX(ICM_GETQUALITY);
+        XX(ICM_GETSTATE);
+        XX(ICM_SETQUALITY);
+        XX(ICM_SET);
+        XX(ICM_SETSTATE);
+        /* ICM_USER+X */
+        XX(ICM_COMPRESS_FRAMES_INFO);
+        XX(ICM_COMPRESS_GET_FORMAT);
+        XX(ICM_COMPRESS_GET_SIZE);
+        XX(ICM_COMPRESS_QUERY);
+        XX(ICM_COMPRESS_BEGIN);
+        XX(ICM_COMPRESS);
+        XX(ICM_COMPRESS_END);
+        XX(ICM_DECOMPRESS_GET_FORMAT);
+        XX(ICM_DECOMPRESS_QUERY);
+        XX(ICM_DECOMPRESS_BEGIN);
+        XX(ICM_DECOMPRESS);
+        XX(ICM_DECOMPRESS_END);
+        XX(ICM_DECOMPRESS_SET_PALETTE);
+        XX(ICM_DECOMPRESS_GET_PALETTE);
+        XX(ICM_DRAW_QUERY);
+        XX(ICM_DRAW_BEGIN);
+        XX(ICM_DRAW_GET_PALETTE);
+        XX(ICM_DRAW_START);
+        XX(ICM_DRAW_STOP);
+        XX(ICM_DRAW_END);
+        XX(ICM_DRAW_GETTIME);
+        XX(ICM_DRAW);
+        XX(ICM_DRAW_WINDOW);
+        XX(ICM_DRAW_SETTIME);
+        XX(ICM_DRAW_REALIZE);
+        XX(ICM_DRAW_FLUSH);
+        XX(ICM_DRAW_RENDERBUFFER);
+        XX(ICM_DRAW_START_PLAY);
+        XX(ICM_DRAW_STOP_PLAY);
+        XX(ICM_DRAW_SUGGESTFORMAT);
+        XX(ICM_DRAW_CHANGEPALETTE);
+        XX(ICM_GETBUFFERSWANTED);
+        XX(ICM_GETDEFAULTKEYFRAMERATE);
+        XX(ICM_DECOMPRESSEX_BEGIN);
+        XX(ICM_DECOMPRESSEX_QUERY);
+        XX(ICM_DECOMPRESSEX);
+        XX(ICM_DECOMPRESSEX_END);
+        XX(ICM_SET_STATUS_PROC);
+    default:
+        FIXME("(%p,0x%08lx,0x%08lx,0x%08lx) unknown message\n",hic,(DWORD)msg,lParam1,lParam2);
+    }
+    
 #undef XX
-
-	if (!whic) return ICERR_BADHANDLE;
-
-	if (whic->driverproc) { /* IC is a function */
-		bDrv32 = whic->private;
-	} else {
-		bDrv32 = ((GetDriverFlags(whic->hdrv) & (WINE_GDF_EXIST|WINE_GDF_16BIT)) == WINE_GDF_EXIST);
-	}
-
-	if (!bFrom32) {
-		if (bDrv32)
-			data16 = MSVIDEO_MapMsg16To32(msg,&lParam1,&lParam2);
-	} else {
-		if (!bDrv32) {
-			ERR("Can't do 32->16 mappings\n");
-			ret = -1;
-			goto out;
-		}
-	}
-
-	if (whic->driverproc) {
-		if (bDrv32) {
-			ret = whic->driverproc(whic->hdrv,hic,msg,lParam1,lParam2);
-		} else {
-			ret = MSVIDEO_CallTo16_long_lwwll((FARPROC16)whic->driverproc,(LONG)whic->hdrv,HIC_16(hic),msg,lParam1,lParam2);
-		}
-	} else {
-		ret = SendDriverMessage(whic->hdrv,msg,lParam1,lParam2);
-	}
-
-	if (data16)
-		MSVIDEO_UnmapMsg16To32(msg,data16,&lParam1,&lParam2);
-
- out:
-	GlobalUnlock16(HIC_16(hic));
-
-	TRACE("	-> 0x%08lx\n",ret);
-	return ret;
+    
+    if (!whic) return ICERR_BADHANDLE;
+    
+    if (whic->driverproc) {
+        ret = whic->driverproc((DWORD)hic, whic->hdrv, msg, lParam1, lParam2);
+    } else {
+        ret = SendDriverMessage(whic->hdrv, msg, lParam1, lParam2);
+    }
+
+    GlobalUnlock16(HIC_16(hic));
+    
+    TRACE("	-> 0x%08lx\n",ret);
+    return ret;
 }
 
 /***********************************************************************
  *		ICSendMessage			[MSVFW32.@]
  */
 LRESULT VFWAPI ICSendMessage(HIC hic, UINT msg, DWORD lParam1, DWORD lParam2) {
-	return MSVIDEO_SendMessage(hic,msg,lParam1,lParam2,TRUE);
-}
-
-/***********************************************************************
- *		ICSendMessage			[MSVIDEO.205]
- */
-LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2) {
-	return MSVIDEO_SendMessage(HIC_32(hic),msg,lParam1,lParam2,FALSE);
+	return MSVIDEO_SendMessage(hic,msg,lParam1,lParam2);
 }
 
 /***********************************************************************
Index: dlls/msvideo/msvideo.spec
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/msvideo/msvideo.spec,v
retrieving revision 1.6
diff -u -u -r1.6 msvideo.spec
--- dlls/msvideo/msvideo.spec	21 Jun 2002 19:15:48 -0000	1.6
+++ dlls/msvideo/msvideo.spec	29 Oct 2002 17:35:10 -0000
@@ -1,7 +1,7 @@
 2 pascal VideoForWindowsVersion() VideoForWindowsVersion
 20 stub VIDEOGETNUMDEVS
 21 stub VIDEOGETERRORTEXT
-22 pascal VideoCapDriverDescAndVer(word ptr word ptr word) VideoCapDriverDescAndVer
+22 pascal VideoCapDriverDescAndVer(word ptr word ptr word) VideoCapDriverDescAndVer16
 28 stub VIDEOOPEN
 29 stub VIDEOCLOSE
 30 stub VIDEODIALOG
@@ -64,3 +64,6 @@
 251 stub _MCIWNDREGISTERCLASS
 252 stub GETOPENFILENAMEPREVIEW
 253 stub GETSAVEFILENAMEPREVIEW
+
+2000 pascal DllEntryPoint(long word word word long word) VIDEO_LibMain
+
Index: dlls/msvideo/vfw16.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/msvideo/vfw16.h,v
retrieving revision 1.6
diff -u -u -r1.6 vfw16.h
--- dlls/msvideo/vfw16.h	23 Oct 2002 23:33:21 -0000	1.6
+++ dlls/msvideo/vfw16.h	29 Oct 2002 17:45:01 -0000
@@ -118,14 +118,6 @@
 HIC16   VFWAPI  ICOpenFunction16(DWORD,DWORD,UINT16,FARPROC16);
 LRESULT VFWAPI  ICSendMessage16(HIC16,UINT16,DWORD,DWORD);
 
-/* handle16 --> handle conversions */
-#define HDRAWDIB_32(h16)	((HDRAWDIB)(ULONG_PTR)(h16))
-#define HIC_32(h16)		((HIC)(ULONG_PTR)(h16))
-
-/* handle --> handle16 conversions */
-#define HDRAWDIB_16(h32)	(LOWORD(h32))
-#define HIC_16(h32)		(LOWORD(h32))
-
 #ifdef __cplusplus
 }
 #endif  /* __cplusplus */
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msvideo/msvideo_private.h	Wed Oct 30 18:39:24 2002
@@ -0,0 +1,31 @@
+/* HIC struct (same layout as Win95 one) */
+typedef struct tagWINE_HIC {
+	DWORD		magic;		/* 00: 'Smag' */
+	HANDLE		curthread;	/* 04: */
+	DWORD		type;		/* 08: */
+	DWORD		handler;	/* 0C: */
+	HDRVR		hdrv;		/* 10: */
+	DWORD		private;	/* 14:(handled by SendDriverMessage)*/
+	DRIVERPROC	driverproc;	/* 18:(handled by SendDriverMessage)*/
+	DWORD		x1;		/* 1c: name? */
+	WORD		x2;		/* 20: */
+	DWORD		x3;		/* 22: */
+					/* 26: */
+        DRIVERPROC16    driverproc16;   /* Wine specific flags */
+} WINE_HIC;
+
+HIC     MSVIDEO_OpenFunction(DWORD, DWORD, UINT, DRIVERPROC, DRIVERPROC16);
+LRESULT MSVIDEO_SendMessage(HIC, UINT, DWORD, DWORD);
+
+extern LRESULT  (CALLBACK *pFnCallTo16)(HDRVR, HIC, UINT, LPARAM, LPARAM);
+
+#define HDRVR_16(h32)		(LOWORD(h32))
+
+/* handle16 --> handle conversions */
+#define HDRAWDIB_32(h16)	((HDRAWDIB)(ULONG_PTR)(h16))
+#define HIC_32(h16)		((HIC)(ULONG_PTR)(h16))
+
+/* handle --> handle16 conversions */
+#define HDRAWDIB_16(h32)	(LOWORD(h32))
+#define HIC_16(h32)		(LOWORD(h32))
+


More information about the wine-patches mailing list