[PATCH 2/2] [MsVideo16]: now compiling msvideo16 as a separate 16bit module
Eric Pouech
eric.pouech at orange.fr
Thu May 14 14:36:39 CDT 2009
A+
---
.gitignore | 1
configure.ac | 1
dlls/Makefile.in | 4
dlls/msvfw32/msvideo.spec | 68 --
dlls/msvfw32/msvideo16.c | 968 ---------------------------------
dlls/msvideo.dll16/Makefile.in | 16 +
dlls/msvideo.dll16/msvideo.dll16.spec | 68 ++
dlls/msvideo.dll16/msvideo16.c | 968 +++++++++++++++++++++++++++++++++
8 files changed, 1053 insertions(+), 1041 deletions(-)
delete mode 100644 dlls/msvfw32/msvideo.spec
delete mode 100644 dlls/msvfw32/msvideo16.c
create mode 100644 dlls/msvideo.dll16/Makefile.in
create mode 100644 dlls/msvideo.dll16/msvideo.dll16.spec
create mode 100644 dlls/msvideo.dll16/msvideo16.c
diff --git a/.gitignore b/.gitignore
index 3ce8388..78ff6c5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,7 +53,6 @@ dlls/msi/sql.tab.c
dlls/msi/sql.tab.h
dlls/mstask/mstask_local.h
dlls/mstask/mstask_local_i.c
-dlls/msvideo.dll16
dlls/msxml3/msxml3_v1.tlb
dlls/ole32/dcom.h
dlls/ole32/dcom_p.c
diff --git a/configure.ac b/configure.ac
index 4ab3f6a..fc88e58 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2118,6 +2118,7 @@ WINE_CONFIG_MAKEFILE([dlls/msvcrtd/tests/Makefile],[dlls/Maketest.rules],[dlls],
WINE_CONFIG_MAKEFILE([dlls/msvfw32/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
WINE_CONFIG_MAKEFILE([dlls/msvfw32/tests/Makefile],[dlls/Maketest.rules],[dlls],[ALL_TEST_DIRS],[enable_tests])
WINE_CONFIG_MAKEFILE([dlls/msvidc32/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
+WINE_CONFIG_MAKEFILE([dlls/msvideo.dll16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16])
WINE_CONFIG_MAKEFILE([dlls/mswsock/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
WINE_CONFIG_MAKEFILE([dlls/msxml3/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
WINE_CONFIG_MAKEFILE([dlls/msxml3/tests/Makefile],[dlls/Maketest.rules],[dlls],[ALL_TEST_DIRS],[enable_tests])
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index a040570..b600c3a 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -22,7 +22,6 @@ WIN16_FILES = \
gdi.exe16 \
krnl386.exe16 \
mmsystem.dll16 \
- msvideo.dll16 \
setupx.dll16 \
system.drv16 \
toolhelp.dll16 \
@@ -50,9 +49,6 @@ gdi.exe16 wing.dll16:
krnl386.exe16 system.drv16 toolhelp.dll16:
echo "kernel32.dll" >$@
-msvideo.dll16:
- echo "msvfw32.dll" >$@
-
setupx.dll16:
echo "setupapi.dll" >$@
diff --git a/dlls/msvfw32/msvideo.spec b/dlls/msvfw32/msvideo.spec
deleted file mode 100644
index b44fcde..0000000
--- a/dlls/msvfw32/msvideo.spec
+++ /dev/null
@@ -1,68 +0,0 @@
-#1 pascal WEP(word)
-2 pascal VideoForWindowsVersion() VideoForWindowsVersion
-3 pascal DllEntryPoint(long word word word long word) VIDEO_LibMain
-20 stub VIDEOGETNUMDEVS
-21 stub VIDEOGETERRORTEXT
-22 pascal VideoCapDriverDescAndVer(word ptr word ptr word) VideoCapDriverDescAndVer16
-28 stub VIDEOOPEN
-29 stub VIDEOCLOSE
-30 stub VIDEODIALOG
-31 stub VIDEOFRAME
-32 stub VIDEOCONFIGURE
-33 stub VIDEOCONFIGURESTORAGE
-34 stub VIDEOGETCHANNELCAPS
-35 stub VIDEOUPDATE
-40 stub VIDEOSTREAMADDBUFFER
-41 stub VIDEOSTREAMFINI
-42 stub VIDEOSTREAMGETERROR
-43 stub VIDEOSTREAMGETPOSITION
-44 stub VIDEOSTREAMINIT
-46 stub VIDEOSTREAMPREPAREHEADER
-47 stub VIDEOSTREAMRESET
-49 stub VIDEOSTREAMSTART
-50 stub VIDEOSTREAMSTOP
-51 stub VIDEOSTREAMUNPREPAREHEADER
-52 stub VIDEOSTREAMALLOCHDRANDBUFFER
-53 stub VIDEOSTREAMFREEHDRANDBUFFER
-60 stub VIDEOMESSAGE
-102 pascal -ret16 DrawDibOpen() DrawDibOpen16
-103 pascal -ret16 DrawDibClose(word) DrawDibClose16
-104 pascal -ret16 DrawDibBegin(word word s_word s_word ptr s_word s_word word) DrawDibBegin16
-105 pascal -ret16 DrawDibEnd(word) DrawDibEnd16
-106 pascal -ret16 DrawDibDraw(word word s_word s_word s_word s_word ptr ptr s_word s_word s_word s_word word) DrawDibDraw16
-108 pascal -ret16 DrawDibGetPalette(word) DrawDibGetPalette16
-110 pascal -ret16 DrawDibSetPalette(word word) DrawDibSetPalette16
-111 stub DRAWDIBCHANGEPALETTE
-112 pascal -ret16 DrawDibRealize(word word word) DrawDibRealize16
-113 stub DRAWDIBTIME
-114 stub DRAWDIBPROFILEDISPLAY
-115 stub STRETCHDIB
-118 pascal -ret16 DrawDibStart(word long) DrawDibStart16
-119 pascal -ret16 DrawDibStop(word) DrawDibStop16
-120 stub DRAWDIBGETBUFFER
-200 pascal -ret16 ICInfo(long long segptr) ICInfo16
-201 stub ICINSTALL
-202 stub ICREMOVE
-203 pascal -ret16 ICOpen(long long word) ICOpen16
-204 pascal ICClose(word) ICClose16
-205 pascal ICSendMessage(word word long long) ICSendMessage16
-206 pascal -ret16 ICOpenFunction(long long word segptr) ICOpenFunction16
-207 varargs _ICMessage(word word word) ICMessage16
-212 pascal ICGetInfo(word segptr long) ICGetInfo16
-213 pascal -ret16 ICLocate(long long ptr ptr word) ICLocate16
-224 cdecl _ICCompress(word long segptr segptr segptr segptr segptr segptr long long long segptr segptr) ICCompress16
-230 cdecl _ICDecompress(word long segptr segptr segptr segptr) ICDecompress16
-232 cdecl _ICDrawBegin(word long word word word s_word s_word s_word s_word segptr s_word s_word s_word s_word long long) ICDrawBegin16
-234 cdecl _ICDraw(word long segptr segptr long long) ICDraw16
-239 pascal -ret16 ICGetDisplayFormat(word ptr ptr s_word s_word s_word) ICGetDisplayFormat16
-240 stub ICIMAGECOMPRESS
-241 stub ICIMAGEDECOMPRESS
-242 stub ICCOMPRESSORCHOOSE
-243 stub ICCOMPRESSORFREE
-244 stub ICSEQCOMPRESSFRAMESTART
-245 stub ICSEQCOMPRESSFRAMEEND
-246 stub ICSEQCOMPRESSFRAME
-250 stub _MCIWNDCREATE
-251 stub _MCIWNDREGISTERCLASS
-252 stub GETOPENFILENAMEPREVIEW
-253 stub GETSAVEFILENAMEPREVIEW
diff --git a/dlls/msvfw32/msvideo16.c b/dlls/msvfw32/msvideo16.c
deleted file mode 100644
index 69321f5..0000000
--- a/dlls/msvfw32/msvideo16.c
+++ /dev/null
@@ -1,968 +0,0 @@
-/*
- * msvideo 16-bit functions
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 2000 Bradley Baetz
- *
- * 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 <stdio.h>
-#include <string.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "winver.h"
-#include "winnls.h"
-#include "winreg.h"
-#include "winuser.h"
-#include "vfw16.h"
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(msvideo);
-
-/* Drivers32 settings */
-#define HKLM_DRIVERS32 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32"
-
-/* handle16 --> handle conversions */
-#define HDRAWDIB_32(h16) ((HDRAWDIB)(ULONG_PTR)(h16))
-#define HIC_32(h16) ((HIC)(ULONG_PTR)(h16))
-
-/* handle --> handle16 conversions */
-#define HDRVR_16(h32) (LOWORD(h32))
-#define HDRAWDIB_16(h32) (LOWORD(h32))
-#define HIC_16(h32) (LOWORD(h32))
-
-/***********************************************************************
- * DrawDibOpen [MSVIDEO.102]
- */
-HDRAWDIB16 VFWAPI DrawDibOpen16(void)
-{
- return HDRAWDIB_16(DrawDibOpen());
-}
-
-/***********************************************************************
- * DrawDibClose [MSVIDEO.103]
- */
-BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd)
-{
- return DrawDibClose(HDRAWDIB_32(hdd));
-}
-
-/************************************************************************
- * DrawDibBegin [MSVIDEO.104]
- */
-BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd, HDC16 hdc, INT16 dxDst,
- INT16 dyDst, LPBITMAPINFOHEADER lpbi, INT16 dxSrc,
- INT16 dySrc, UINT16 wFlags)
-{
- return DrawDibBegin(HDRAWDIB_32(hdd), HDC_32(hdc), dxDst, dyDst, lpbi,
- dxSrc, dySrc, wFlags);
-}
-
-/***********************************************************************
- * DrawDibEnd [MSVIDEO.105]
- */
-BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd)
-{
- return DrawDibEnd(HDRAWDIB_32(hdd));
-}
-
-/**********************************************************************
- * DrawDibDraw [MSVIDEO.106]
- */
-BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd, HDC16 hdc, INT16 xDst, INT16 yDst,
- INT16 dxDst, INT16 dyDst, LPBITMAPINFOHEADER lpbi,
- LPVOID lpBits, INT16 xSrc, INT16 ySrc, INT16 dxSrc,
- INT16 dySrc, UINT16 wFlags)
-{
- return DrawDibDraw(HDRAWDIB_32(hdd), HDC_32(hdc), xDst, yDst, dxDst,
- dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, wFlags);
-}
-
-/***********************************************************************
- * DrawDibGetPalette [MSVIDEO.108]
- */
-HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd)
-{
- return HPALETTE_16(DrawDibGetPalette(HDRAWDIB_32(hdd)));
-}
-
-/***********************************************************************
- * DrawDibSetPalette [MSVIDEO.110]
- */
-BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal)
-{
- return DrawDibSetPalette(HDRAWDIB_32(hdd), HPALETTE_32(hpal));
-}
-
-/***********************************************************************
- * DrawDibRealize [MSVIDEO.112]
- */
-UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc,
- BOOL16 fBackground)
-{
- return (UINT16)DrawDibRealize(HDRAWDIB_32(hdd), HDC_32(hdc), fBackground);
-}
-
-/*************************************************************************
- * DrawDibStart [MSVIDEO.118]
- */
-BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate)
-{
- return DrawDibStart(HDRAWDIB_32(hdd), rate);
-}
-
-/*************************************************************************
- * DrawDibStop [MSVIDEO.119]
- */
-BOOL16 VFWAPI DrawDibStop16(HDRAWDIB16 hdd)
-{
- return DrawDibStop(HDRAWDIB_32(hdd));
-}
-
-/***********************************************************************
- * ICOpen [MSVIDEO.203]
- */
-HIC16 VFWAPI ICOpen16(DWORD fccType, DWORD fccHandler, UINT16 wMode)
-{
- return HIC_16(ICOpen(fccType, fccHandler, wMode));
-}
-
-/***********************************************************************
- * _ICMessage [MSVIDEO.207]
- */
-LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist )
-{
- LPWORD lpData;
- SEGPTR segData;
- LRESULT ret;
- UINT16 i;
-
- lpData = HeapAlloc(GetProcessHeap(), 0, cb);
-
- TRACE("0x%08x, %u, %u, ...)\n", (DWORD) hic, msg, cb);
-
- for (i = 0; i < cb / sizeof(WORD); i++)
- {
- lpData[i] = VA_ARG16(valist, WORD);
- }
-
- segData = MapLS(lpData);
- ret = ICSendMessage16(hic, msg, segData, (DWORD) cb);
- UnMapLS(segData);
- HeapFree(GetProcessHeap(), 0, lpData);
- return ret;
-}
-
-/***********************************************************************
- * ICGetInfo [MSVIDEO.212]
- */
-LRESULT VFWAPI ICGetInfo16(HIC16 hic, ICINFO16 * picinfo, DWORD cb)
-{
- LRESULT ret;
-
- TRACE("(0x%08x,%p,%d)\n", (DWORD) hic, picinfo, cb);
- ret = ICSendMessage16(hic, ICM_GETINFO, (DWORD) picinfo, cb);
- TRACE(" -> 0x%08lx\n", ret);
- return ret;
-}
-
-/***********************************************************************
- * ICLocate [MSVIDEO.213]
- */
-HIC16 VFWAPI ICLocate16(DWORD fccType, DWORD fccHandler,
- LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut,
- WORD wFlags)
-{
- return HIC_16(ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, wFlags));
-}
-
-/***********************************************************************
- * _ICCompress [MSVIDEO.224]
- */
-DWORD VFWAPIV ICCompress16(HIC16 hic, DWORD dwFlags,
- LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData,
- LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits,
- LPDWORD lpckid, LPDWORD lpdwFlags,
- LONG lFrameNum, DWORD dwFrameSize,
- DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev,
- LPVOID lpPrev)
-{
- DWORD ret;
- ICCOMPRESS iccmp;
- SEGPTR seg_iccmp;
-
- TRACE("(0x%08x,%d,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags,
- lpbiOutput, lpData, lpbiInput, lpBits);
-
- iccmp.dwFlags = dwFlags;
-
- iccmp.lpbiOutput = lpbiOutput;
- iccmp.lpOutput = lpData;
- iccmp.lpbiInput = lpbiInput;
- iccmp.lpInput = lpBits;
-
- iccmp.lpckid = lpckid;
- iccmp.lpdwFlags = lpdwFlags;
- iccmp.lFrameNum = lFrameNum;
- iccmp.dwFrameSize = dwFrameSize;
- iccmp.dwQuality = dwQuality;
- iccmp.lpbiPrev = lpbiPrev;
- iccmp.lpPrev = lpPrev;
- seg_iccmp = MapLS(&iccmp);
- ret = ICSendMessage16(hic, ICM_COMPRESS, seg_iccmp, sizeof(ICCOMPRESS));
- UnMapLS(seg_iccmp);
- return ret;
-}
-
-/***********************************************************************
- * _ICDecompress [MSVIDEO.230]
- */
-DWORD VFWAPIV ICDecompress16(HIC16 hic, DWORD dwFlags,
- LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData,
- LPBITMAPINFOHEADER lpbi, LPVOID lpBits)
-{
- ICDECOMPRESS icd;
- SEGPTR segptr;
- DWORD ret;
-
- TRACE("(0x%08x,%d,%p,%p,%p,%p)\n", (DWORD) hic, dwFlags, lpbiFormat,
- lpData, lpbi, lpBits);
-
- icd.dwFlags = dwFlags;
- icd.lpbiInput = lpbiFormat;
- icd.lpInput = lpData;
- icd.lpbiOutput = lpbi;
- icd.lpOutput = lpBits;
- icd.ckid = 0;
- segptr = MapLS(&icd);
- ret = ICSendMessage16(hic, ICM_DECOMPRESS, segptr, sizeof(ICDECOMPRESS));
- UnMapLS(segptr);
- return ret;
-}
-
-/***********************************************************************
- * _ICDrawBegin [MSVIDEO.232]
- */
-DWORD VFWAPIV ICDrawBegin16(HIC16 hic, /* [in] */
- DWORD dwFlags, /* [in] flags */
- HPALETTE16 hpal, /* [in] palette to draw with */
- HWND16 hwnd, /* [in] window to draw to */
- HDC16 hdc, /* [in] HDC to draw to */
- INT16 xDst, /* [in] destination rectangle */
- INT16 yDst, /* [in] */
- INT16 dxDst, /* [in] */
- INT16 dyDst, /* [in] */
- LPBITMAPINFOHEADER lpbi, /* [in] format of frame to draw NOTE: SEGPTR */
- INT16 xSrc, /* [in] source rectangle */
- INT16 ySrc, /* [in] */
- INT16 dxSrc, /* [in] */
- INT16 dySrc, /* [in] */
- DWORD dwRate, /* [in] frames/second = (dwRate/dwScale) */
- DWORD dwScale) /* [in] */
-{
- DWORD ret;
- ICDRAWBEGIN16 icdb;
- SEGPTR seg_icdb;
-
- TRACE ("(0x%08x,%d,0x%08x,0x%08x,0x%08x,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n",
- (DWORD) hic, dwFlags, (DWORD) hpal, (DWORD) hwnd, (DWORD) hdc,
- xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate,
- dwScale);
-
- icdb.dwFlags = dwFlags;
- icdb.hpal = hpal;
- icdb.hwnd = hwnd;
- icdb.hdc = hdc;
- icdb.xDst = xDst;
- icdb.yDst = yDst;
- icdb.dxDst = dxDst;
- icdb.dyDst = dyDst;
- icdb.lpbi = lpbi; /* Keep this as SEGPTR for the mapping code to deal with */
- icdb.xSrc = xSrc;
- icdb.ySrc = ySrc;
- icdb.dxSrc = dxSrc;
- icdb.dySrc = dySrc;
- icdb.dwRate = dwRate;
- icdb.dwScale = dwScale;
- seg_icdb = MapLS(&icdb);
- ret = (DWORD) ICSendMessage16(hic, ICM_DRAW_BEGIN, seg_icdb,
- sizeof(ICDRAWBEGIN16));
- UnMapLS(seg_icdb);
- return ret;
-}
-
-/***********************************************************************
- * _ICDraw [MSVIDEO.234]
- */
-DWORD VFWAPIV ICDraw16(HIC16 hic, DWORD dwFlags,
- LPVOID lpFormat, /* [???] NOTE: SEGPTR */
- LPVOID lpData, /* [???] NOTE: SEGPTR */
- DWORD cbData, LONG lTime)
-{
- DWORD ret;
- ICDRAW icd;
- SEGPTR seg_icd;
-
- TRACE("(0x%08x,0x%08x,%p,%p,%d,%d)\n", (DWORD) hic, dwFlags,
- lpFormat, lpData, cbData, lTime);
- icd.dwFlags = dwFlags;
- icd.lpFormat = lpFormat;
- icd.lpData = lpData;
- icd.cbData = cbData;
- icd.lTime = lTime;
- seg_icd = MapLS(&icd);
- ret = ICSendMessage16(hic, ICM_DRAW, seg_icd, sizeof(ICDRAW));
- UnMapLS(seg_icd);
- return ret;
-}
-
-/***********************************************************************
- * ICGetDisplayFormat [MSVIDEO.239]
- */
-HIC16 VFWAPI ICGetDisplayFormat16(HIC16 hic, LPBITMAPINFOHEADER lpbiIn,
- LPBITMAPINFOHEADER lpbiOut, INT16 depth,
- INT16 dx, INT16 dy)
-{
- 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 = 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(DWORD pfn16, HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2)
-{
- WORD args[8];
- DWORD ret = 0;
-
- switch (msg)
- {
- case DRV_OPEN:
- lp2 = (DWORD)MapLS((void*)lp2);
- break;
- }
- args[7] = HIWORD(hic);
- args[6] = LOWORD(hic);
- args[5] = HDRVR_16(hdrv);
- args[4] = msg;
- args[3] = HIWORD(lp1);
- args[2] = LOWORD(lp1);
- args[1] = HIWORD(lp2);
- args[0] = LOWORD(lp2);
- WOWCallback16Ex( pfn16, WCB16_PASCAL, sizeof(args), args, &ret );
-
- switch (msg)
- {
- case DRV_OPEN:
- UnMapLS(lp2);
- break;
- }
- return ret;
-}
-
-#define MAX_THUNKS 32
-
-static struct msvideo_thunk
-{
- BYTE popl_eax; /* popl %eax (return address) */
- BYTE pushl_func; /* pushl $pfn16 (16bit callback function) */
- DWORD pfn16;
- BYTE pushl_eax; /* pushl %eax */
- BYTE jmp; /* ljmp WDML_InvokeCallback16 */
- DWORD callback;
- HIC16 hIC16; /* driver's handle */
-} *MSVIDEO_Thunks;
-
-static CRITICAL_SECTION msvideo_cs;
-static CRITICAL_SECTION_DEBUG critsect_debug =
-{
- 0, 0, &msvideo_cs,
- { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
- 0, 0, { (DWORD_PTR)(__FILE__ ": msvideo_cs") }
-};
-static CRITICAL_SECTION msvideo_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
-
-static struct msvideo_thunk* MSVIDEO_AddThunk(DWORD pfn16)
-{
- struct msvideo_thunk* thunk;
-
- if (!MSVIDEO_Thunks)
- {
- MSVIDEO_Thunks = VirtualAlloc(NULL, MAX_THUNKS * sizeof(*MSVIDEO_Thunks), MEM_COMMIT,
- PAGE_EXECUTE_READWRITE);
- if (!MSVIDEO_Thunks) return NULL;
- for (thunk = MSVIDEO_Thunks; thunk < &MSVIDEO_Thunks[MAX_THUNKS]; thunk++)
- {
- thunk->popl_eax = 0x58; /* popl %eax */
- thunk->pushl_func = 0x68; /* pushl $pfn16 */
- thunk->pfn16 = 0;
- thunk->pushl_eax = 0x50; /* pushl %eax */
- thunk->jmp = 0xe9; /* jmp IC_Callback3216 */
- thunk->callback = (char *)IC_Callback3216 - (char *)(&thunk->callback + 1);
- thunk->hIC16 = 0;
- }
- }
- for (thunk = MSVIDEO_Thunks; thunk < &MSVIDEO_Thunks[MAX_THUNKS]; thunk++)
- {
- if (thunk->pfn16 == 0)
- {
- thunk->pfn16 = pfn16;
- return thunk;
- }
- }
- FIXME("Out of msvideo-thunks. Bump MAX_THUNKS\n");
- return NULL;
-}
-
-static struct msvideo_thunk* MSVIDEO_HasThunk(HIC16 hic)
-{
- struct msvideo_thunk* thunk;
-
- for (thunk = MSVIDEO_Thunks; thunk < &MSVIDEO_Thunks[MAX_THUNKS]; thunk++)
- {
- if (thunk->hIC16 == hic) return thunk;
- }
- return NULL;
-}
-
-/***********************************************************************
- * ICOpenFunction [MSVIDEO.206]
- */
-HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler)
-{
- HIC hic32;
- struct msvideo_thunk* thunk;
-
- EnterCriticalSection(&msvideo_cs);
- if (!(thunk = MSVIDEO_AddThunk((DWORD)lpfnHandler))) return 0;
- if ((hic32 = ICOpenFunction(fccType, fccHandler, wMode, IC_Callback3216)))
- thunk->hIC16 = HIC_16(hic32);
- else
- thunk->pfn16 = 0;
- LeaveCriticalSection(&msvideo_cs);
- return HIC_16(hic32);
-}
-
-/***********************************************************************
- * ICSendMessage [MSVIDEO.205]
- */
-LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2)
-{
- LRESULT ret = ICERR_BADHANDLE;
- struct msvideo_thunk* thunk;
-
- if ((thunk = MSVIDEO_HasThunk(hic)))
- {
- WORD args[8];
- DWORD result;
-
- /* FIXME: original code was passing hdrv first and hic second */
- /* but this doesn't match what IC_Callback3216 does */
- args[7] = HIWORD(hic);
- args[6] = LOWORD(hic);
- args[5] = 0; /* the 32bit also sets it to NULL */
- args[4] = msg;
- args[3] = HIWORD(lParam1);
- args[2] = LOWORD(lParam1);
- args[1] = HIWORD(lParam2);
- args[0] = LOWORD(lParam2);
- WOWCallback16Ex( thunk->pfn16, WCB16_PASCAL, sizeof(args), args, &result );
- ret = result;
- }
- else
- {
- /* map the message for a 32 bit infrastructure, and pass it along */
- void* data16 = MSVIDEO_MapMsg16To32(msg, &lParam1, &lParam2);
-
- ret = ICSendMessage(HIC_32(hic), msg, lParam1, lParam2);
- if (data16)
- MSVIDEO_UnmapMsg16To32(msg, data16, &lParam1, &lParam2);
- }
- return ret;
-}
-
-/***********************************************************************
- * ICClose [MSVIDEO.204]
- */
-LRESULT WINAPI ICClose16(HIC16 hic)
-{
- BOOL ret = ICClose(HIC_32(hic));
-
- EnterCriticalSection(&msvideo_cs);
- if (ret)
- {
- struct msvideo_thunk* thunk;
- if ((thunk = MSVIDEO_HasThunk(hic)))
- {
- thunk->pfn16 = 0;
- thunk->hIC16 = 0;
- }
- else ret = FALSE;
- }
- LeaveCriticalSection(&msvideo_cs);
- return ret;
-}
-
-/***********************************************************************
- * VideoCapDriverDescAndVer [MSVIDEO.22]
- */
-DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len,
- LPSTR buf2, WORD buf2len)
-{
- static const char version_info_spec[] = "\\StringFileInfo\\040904E4\\FileDescription";
- DWORD verhandle;
- DWORD infosize;
- UINT subblocklen;
- char *s, buf[2048], fn[260];
- LPBYTE infobuf;
- LPVOID subblock;
- DWORD i, cnt = 0, lRet;
- DWORD bufLen, fnLen;
- FILETIME lastWrite;
- HKEY hKey;
- BOOL found = FALSE;
-
- TRACE("(%d,%p,%d,%p,%d)\n", nr, buf1, buf1len, buf2, buf2len);
- lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey);
- if (lRet == ERROR_SUCCESS)
- {
- RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0);
- for (i = 0; i < cnt; i++)
- {
- bufLen = sizeof(buf) / sizeof(buf[0]);
- lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite);
- if (lRet != ERROR_SUCCESS) continue;
- if (strncasecmp(buf, "vid", 3)) continue;
- if (nr--) continue;
- fnLen = sizeof(fn);
- lRet = RegQueryValueExA(hKey, buf, 0, 0, (LPBYTE)fn, &fnLen);
- if (lRet == ERROR_SUCCESS) found = TRUE;
- break;
- }
- RegCloseKey( hKey );
- }
-
- /* search system.ini if not found in the registry */
- if (!found && GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini"))
- {
- for (s = buf; *s; s += strlen(s) + 1)
- {
- if (strncasecmp(s, "vid", 3)) continue;
- if (nr--) continue;
- if (GetPrivateProfileStringA("drivers32", s, NULL, fn, sizeof(fn), "system.ini"))
- found = TRUE;
- break;
- }
- }
-
- if (!found)
- {
- TRACE("No more VID* entries found nr=%d\n", nr);
- return 20;
- }
- 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))
- {
- /* Yes, two space behind : */
- /* FIXME: test for buflen */
- snprintf(buf2, buf2len, "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, buf2);
- }
- else
- {
- TRACE("GetFileVersionInfoA failed for %s.\n", fn);
- lstrcpynA(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/
- }
- /* FIXME: language problem? */
- if (VerQueryValueA( infobuf,
- version_info_spec,
- &subblock,
- &subblocklen
- ))
- {
- UINT copylen = min(subblocklen,buf1len-1);
- memcpy(buf1, subblock, copylen);
- buf1[copylen] = '\0';
- TRACE("VQA returned %s\n", (LPCSTR)subblock);
- }
- else
- {
- TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n");
- lstrcpynA(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/
- }
- HeapFree(GetProcessHeap(), 0, infobuf);
- return 0;
-}
-
-/**************************************************************************
- * DllEntryPoint (MSVIDEO.3)
- *
- * 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:
- break;
- case DLL_PROCESS_DETACH:
- break;
- case DLL_THREAD_ATTACH:
- case DLL_THREAD_DETACH:
- break;
- }
- return TRUE;
-}
diff --git a/dlls/msvideo.dll16/Makefile.in b/dlls/msvideo.dll16/Makefile.in
new file mode 100644
index 0000000..1944a08
--- /dev/null
+++ b/dlls/msvideo.dll16/Makefile.in
@@ -0,0 +1,16 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+MODULE = msvideo.dll16
+IMPORTS = msvfw32 kernel32
+
+EXTRADLLFLAGS = -Wb,--subsystem,win16
+
+SPEC_SRCS = msvideo.dll16.spec
+
+C_SRCS = msvideo16.c
+
+ at MAKE_DLL_RULES@
+
+ at DEPENDENCIES@ # everything below this line is overwritten by make depend
diff --git a/dlls/msvideo.dll16/msvideo.dll16.spec b/dlls/msvideo.dll16/msvideo.dll16.spec
new file mode 100644
index 0000000..b44fcde
--- /dev/null
+++ b/dlls/msvideo.dll16/msvideo.dll16.spec
@@ -0,0 +1,68 @@
+#1 pascal WEP(word)
+2 pascal VideoForWindowsVersion() VideoForWindowsVersion
+3 pascal DllEntryPoint(long word word word long word) VIDEO_LibMain
+20 stub VIDEOGETNUMDEVS
+21 stub VIDEOGETERRORTEXT
+22 pascal VideoCapDriverDescAndVer(word ptr word ptr word) VideoCapDriverDescAndVer16
+28 stub VIDEOOPEN
+29 stub VIDEOCLOSE
+30 stub VIDEODIALOG
+31 stub VIDEOFRAME
+32 stub VIDEOCONFIGURE
+33 stub VIDEOCONFIGURESTORAGE
+34 stub VIDEOGETCHANNELCAPS
+35 stub VIDEOUPDATE
+40 stub VIDEOSTREAMADDBUFFER
+41 stub VIDEOSTREAMFINI
+42 stub VIDEOSTREAMGETERROR
+43 stub VIDEOSTREAMGETPOSITION
+44 stub VIDEOSTREAMINIT
+46 stub VIDEOSTREAMPREPAREHEADER
+47 stub VIDEOSTREAMRESET
+49 stub VIDEOSTREAMSTART
+50 stub VIDEOSTREAMSTOP
+51 stub VIDEOSTREAMUNPREPAREHEADER
+52 stub VIDEOSTREAMALLOCHDRANDBUFFER
+53 stub VIDEOSTREAMFREEHDRANDBUFFER
+60 stub VIDEOMESSAGE
+102 pascal -ret16 DrawDibOpen() DrawDibOpen16
+103 pascal -ret16 DrawDibClose(word) DrawDibClose16
+104 pascal -ret16 DrawDibBegin(word word s_word s_word ptr s_word s_word word) DrawDibBegin16
+105 pascal -ret16 DrawDibEnd(word) DrawDibEnd16
+106 pascal -ret16 DrawDibDraw(word word s_word s_word s_word s_word ptr ptr s_word s_word s_word s_word word) DrawDibDraw16
+108 pascal -ret16 DrawDibGetPalette(word) DrawDibGetPalette16
+110 pascal -ret16 DrawDibSetPalette(word word) DrawDibSetPalette16
+111 stub DRAWDIBCHANGEPALETTE
+112 pascal -ret16 DrawDibRealize(word word word) DrawDibRealize16
+113 stub DRAWDIBTIME
+114 stub DRAWDIBPROFILEDISPLAY
+115 stub STRETCHDIB
+118 pascal -ret16 DrawDibStart(word long) DrawDibStart16
+119 pascal -ret16 DrawDibStop(word) DrawDibStop16
+120 stub DRAWDIBGETBUFFER
+200 pascal -ret16 ICInfo(long long segptr) ICInfo16
+201 stub ICINSTALL
+202 stub ICREMOVE
+203 pascal -ret16 ICOpen(long long word) ICOpen16
+204 pascal ICClose(word) ICClose16
+205 pascal ICSendMessage(word word long long) ICSendMessage16
+206 pascal -ret16 ICOpenFunction(long long word segptr) ICOpenFunction16
+207 varargs _ICMessage(word word word) ICMessage16
+212 pascal ICGetInfo(word segptr long) ICGetInfo16
+213 pascal -ret16 ICLocate(long long ptr ptr word) ICLocate16
+224 cdecl _ICCompress(word long segptr segptr segptr segptr segptr segptr long long long segptr segptr) ICCompress16
+230 cdecl _ICDecompress(word long segptr segptr segptr segptr) ICDecompress16
+232 cdecl _ICDrawBegin(word long word word word s_word s_word s_word s_word segptr s_word s_word s_word s_word long long) ICDrawBegin16
+234 cdecl _ICDraw(word long segptr segptr long long) ICDraw16
+239 pascal -ret16 ICGetDisplayFormat(word ptr ptr s_word s_word s_word) ICGetDisplayFormat16
+240 stub ICIMAGECOMPRESS
+241 stub ICIMAGEDECOMPRESS
+242 stub ICCOMPRESSORCHOOSE
+243 stub ICCOMPRESSORFREE
+244 stub ICSEQCOMPRESSFRAMESTART
+245 stub ICSEQCOMPRESSFRAMEEND
+246 stub ICSEQCOMPRESSFRAME
+250 stub _MCIWNDCREATE
+251 stub _MCIWNDREGISTERCLASS
+252 stub GETOPENFILENAMEPREVIEW
+253 stub GETSAVEFILENAMEPREVIEW
diff --git a/dlls/msvideo.dll16/msvideo16.c b/dlls/msvideo.dll16/msvideo16.c
new file mode 100644
index 0000000..69321f5
--- /dev/null
+++ b/dlls/msvideo.dll16/msvideo16.c
@@ -0,0 +1,968 @@
+/*
+ * msvideo 16-bit functions
+ *
+ * Copyright 1998 Marcus Meissner
+ * Copyright 2000 Bradley Baetz
+ *
+ * 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 <stdio.h>
+#include <string.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winver.h"
+#include "winnls.h"
+#include "winreg.h"
+#include "winuser.h"
+#include "vfw16.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msvideo);
+
+/* Drivers32 settings */
+#define HKLM_DRIVERS32 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32"
+
+/* handle16 --> handle conversions */
+#define HDRAWDIB_32(h16) ((HDRAWDIB)(ULONG_PTR)(h16))
+#define HIC_32(h16) ((HIC)(ULONG_PTR)(h16))
+
+/* handle --> handle16 conversions */
+#define HDRVR_16(h32) (LOWORD(h32))
+#define HDRAWDIB_16(h32) (LOWORD(h32))
+#define HIC_16(h32) (LOWORD(h32))
+
+/***********************************************************************
+ * DrawDibOpen [MSVIDEO.102]
+ */
+HDRAWDIB16 VFWAPI DrawDibOpen16(void)
+{
+ return HDRAWDIB_16(DrawDibOpen());
+}
+
+/***********************************************************************
+ * DrawDibClose [MSVIDEO.103]
+ */
+BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd)
+{
+ return DrawDibClose(HDRAWDIB_32(hdd));
+}
+
+/************************************************************************
+ * DrawDibBegin [MSVIDEO.104]
+ */
+BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd, HDC16 hdc, INT16 dxDst,
+ INT16 dyDst, LPBITMAPINFOHEADER lpbi, INT16 dxSrc,
+ INT16 dySrc, UINT16 wFlags)
+{
+ return DrawDibBegin(HDRAWDIB_32(hdd), HDC_32(hdc), dxDst, dyDst, lpbi,
+ dxSrc, dySrc, wFlags);
+}
+
+/***********************************************************************
+ * DrawDibEnd [MSVIDEO.105]
+ */
+BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd)
+{
+ return DrawDibEnd(HDRAWDIB_32(hdd));
+}
+
+/**********************************************************************
+ * DrawDibDraw [MSVIDEO.106]
+ */
+BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd, HDC16 hdc, INT16 xDst, INT16 yDst,
+ INT16 dxDst, INT16 dyDst, LPBITMAPINFOHEADER lpbi,
+ LPVOID lpBits, INT16 xSrc, INT16 ySrc, INT16 dxSrc,
+ INT16 dySrc, UINT16 wFlags)
+{
+ return DrawDibDraw(HDRAWDIB_32(hdd), HDC_32(hdc), xDst, yDst, dxDst,
+ dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, wFlags);
+}
+
+/***********************************************************************
+ * DrawDibGetPalette [MSVIDEO.108]
+ */
+HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd)
+{
+ return HPALETTE_16(DrawDibGetPalette(HDRAWDIB_32(hdd)));
+}
+
+/***********************************************************************
+ * DrawDibSetPalette [MSVIDEO.110]
+ */
+BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal)
+{
+ return DrawDibSetPalette(HDRAWDIB_32(hdd), HPALETTE_32(hpal));
+}
+
+/***********************************************************************
+ * DrawDibRealize [MSVIDEO.112]
+ */
+UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc,
+ BOOL16 fBackground)
+{
+ return (UINT16)DrawDibRealize(HDRAWDIB_32(hdd), HDC_32(hdc), fBackground);
+}
+
+/*************************************************************************
+ * DrawDibStart [MSVIDEO.118]
+ */
+BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate)
+{
+ return DrawDibStart(HDRAWDIB_32(hdd), rate);
+}
+
+/*************************************************************************
+ * DrawDibStop [MSVIDEO.119]
+ */
+BOOL16 VFWAPI DrawDibStop16(HDRAWDIB16 hdd)
+{
+ return DrawDibStop(HDRAWDIB_32(hdd));
+}
+
+/***********************************************************************
+ * ICOpen [MSVIDEO.203]
+ */
+HIC16 VFWAPI ICOpen16(DWORD fccType, DWORD fccHandler, UINT16 wMode)
+{
+ return HIC_16(ICOpen(fccType, fccHandler, wMode));
+}
+
+/***********************************************************************
+ * _ICMessage [MSVIDEO.207]
+ */
+LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist )
+{
+ LPWORD lpData;
+ SEGPTR segData;
+ LRESULT ret;
+ UINT16 i;
+
+ lpData = HeapAlloc(GetProcessHeap(), 0, cb);
+
+ TRACE("0x%08x, %u, %u, ...)\n", (DWORD) hic, msg, cb);
+
+ for (i = 0; i < cb / sizeof(WORD); i++)
+ {
+ lpData[i] = VA_ARG16(valist, WORD);
+ }
+
+ segData = MapLS(lpData);
+ ret = ICSendMessage16(hic, msg, segData, (DWORD) cb);
+ UnMapLS(segData);
+ HeapFree(GetProcessHeap(), 0, lpData);
+ return ret;
+}
+
+/***********************************************************************
+ * ICGetInfo [MSVIDEO.212]
+ */
+LRESULT VFWAPI ICGetInfo16(HIC16 hic, ICINFO16 * picinfo, DWORD cb)
+{
+ LRESULT ret;
+
+ TRACE("(0x%08x,%p,%d)\n", (DWORD) hic, picinfo, cb);
+ ret = ICSendMessage16(hic, ICM_GETINFO, (DWORD) picinfo, cb);
+ TRACE(" -> 0x%08lx\n", ret);
+ return ret;
+}
+
+/***********************************************************************
+ * ICLocate [MSVIDEO.213]
+ */
+HIC16 VFWAPI ICLocate16(DWORD fccType, DWORD fccHandler,
+ LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut,
+ WORD wFlags)
+{
+ return HIC_16(ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, wFlags));
+}
+
+/***********************************************************************
+ * _ICCompress [MSVIDEO.224]
+ */
+DWORD VFWAPIV ICCompress16(HIC16 hic, DWORD dwFlags,
+ LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData,
+ LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits,
+ LPDWORD lpckid, LPDWORD lpdwFlags,
+ LONG lFrameNum, DWORD dwFrameSize,
+ DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev,
+ LPVOID lpPrev)
+{
+ DWORD ret;
+ ICCOMPRESS iccmp;
+ SEGPTR seg_iccmp;
+
+ TRACE("(0x%08x,%d,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags,
+ lpbiOutput, lpData, lpbiInput, lpBits);
+
+ iccmp.dwFlags = dwFlags;
+
+ iccmp.lpbiOutput = lpbiOutput;
+ iccmp.lpOutput = lpData;
+ iccmp.lpbiInput = lpbiInput;
+ iccmp.lpInput = lpBits;
+
+ iccmp.lpckid = lpckid;
+ iccmp.lpdwFlags = lpdwFlags;
+ iccmp.lFrameNum = lFrameNum;
+ iccmp.dwFrameSize = dwFrameSize;
+ iccmp.dwQuality = dwQuality;
+ iccmp.lpbiPrev = lpbiPrev;
+ iccmp.lpPrev = lpPrev;
+ seg_iccmp = MapLS(&iccmp);
+ ret = ICSendMessage16(hic, ICM_COMPRESS, seg_iccmp, sizeof(ICCOMPRESS));
+ UnMapLS(seg_iccmp);
+ return ret;
+}
+
+/***********************************************************************
+ * _ICDecompress [MSVIDEO.230]
+ */
+DWORD VFWAPIV ICDecompress16(HIC16 hic, DWORD dwFlags,
+ LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData,
+ LPBITMAPINFOHEADER lpbi, LPVOID lpBits)
+{
+ ICDECOMPRESS icd;
+ SEGPTR segptr;
+ DWORD ret;
+
+ TRACE("(0x%08x,%d,%p,%p,%p,%p)\n", (DWORD) hic, dwFlags, lpbiFormat,
+ lpData, lpbi, lpBits);
+
+ icd.dwFlags = dwFlags;
+ icd.lpbiInput = lpbiFormat;
+ icd.lpInput = lpData;
+ icd.lpbiOutput = lpbi;
+ icd.lpOutput = lpBits;
+ icd.ckid = 0;
+ segptr = MapLS(&icd);
+ ret = ICSendMessage16(hic, ICM_DECOMPRESS, segptr, sizeof(ICDECOMPRESS));
+ UnMapLS(segptr);
+ return ret;
+}
+
+/***********************************************************************
+ * _ICDrawBegin [MSVIDEO.232]
+ */
+DWORD VFWAPIV ICDrawBegin16(HIC16 hic, /* [in] */
+ DWORD dwFlags, /* [in] flags */
+ HPALETTE16 hpal, /* [in] palette to draw with */
+ HWND16 hwnd, /* [in] window to draw to */
+ HDC16 hdc, /* [in] HDC to draw to */
+ INT16 xDst, /* [in] destination rectangle */
+ INT16 yDst, /* [in] */
+ INT16 dxDst, /* [in] */
+ INT16 dyDst, /* [in] */
+ LPBITMAPINFOHEADER lpbi, /* [in] format of frame to draw NOTE: SEGPTR */
+ INT16 xSrc, /* [in] source rectangle */
+ INT16 ySrc, /* [in] */
+ INT16 dxSrc, /* [in] */
+ INT16 dySrc, /* [in] */
+ DWORD dwRate, /* [in] frames/second = (dwRate/dwScale) */
+ DWORD dwScale) /* [in] */
+{
+ DWORD ret;
+ ICDRAWBEGIN16 icdb;
+ SEGPTR seg_icdb;
+
+ TRACE ("(0x%08x,%d,0x%08x,0x%08x,0x%08x,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n",
+ (DWORD) hic, dwFlags, (DWORD) hpal, (DWORD) hwnd, (DWORD) hdc,
+ xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate,
+ dwScale);
+
+ icdb.dwFlags = dwFlags;
+ icdb.hpal = hpal;
+ icdb.hwnd = hwnd;
+ icdb.hdc = hdc;
+ icdb.xDst = xDst;
+ icdb.yDst = yDst;
+ icdb.dxDst = dxDst;
+ icdb.dyDst = dyDst;
+ icdb.lpbi = lpbi; /* Keep this as SEGPTR for the mapping code to deal with */
+ icdb.xSrc = xSrc;
+ icdb.ySrc = ySrc;
+ icdb.dxSrc = dxSrc;
+ icdb.dySrc = dySrc;
+ icdb.dwRate = dwRate;
+ icdb.dwScale = dwScale;
+ seg_icdb = MapLS(&icdb);
+ ret = (DWORD) ICSendMessage16(hic, ICM_DRAW_BEGIN, seg_icdb,
+ sizeof(ICDRAWBEGIN16));
+ UnMapLS(seg_icdb);
+ return ret;
+}
+
+/***********************************************************************
+ * _ICDraw [MSVIDEO.234]
+ */
+DWORD VFWAPIV ICDraw16(HIC16 hic, DWORD dwFlags,
+ LPVOID lpFormat, /* [???] NOTE: SEGPTR */
+ LPVOID lpData, /* [???] NOTE: SEGPTR */
+ DWORD cbData, LONG lTime)
+{
+ DWORD ret;
+ ICDRAW icd;
+ SEGPTR seg_icd;
+
+ TRACE("(0x%08x,0x%08x,%p,%p,%d,%d)\n", (DWORD) hic, dwFlags,
+ lpFormat, lpData, cbData, lTime);
+ icd.dwFlags = dwFlags;
+ icd.lpFormat = lpFormat;
+ icd.lpData = lpData;
+ icd.cbData = cbData;
+ icd.lTime = lTime;
+ seg_icd = MapLS(&icd);
+ ret = ICSendMessage16(hic, ICM_DRAW, seg_icd, sizeof(ICDRAW));
+ UnMapLS(seg_icd);
+ return ret;
+}
+
+/***********************************************************************
+ * ICGetDisplayFormat [MSVIDEO.239]
+ */
+HIC16 VFWAPI ICGetDisplayFormat16(HIC16 hic, LPBITMAPINFOHEADER lpbiIn,
+ LPBITMAPINFOHEADER lpbiOut, INT16 depth,
+ INT16 dx, INT16 dy)
+{
+ 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 = 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(DWORD pfn16, HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2)
+{
+ WORD args[8];
+ DWORD ret = 0;
+
+ switch (msg)
+ {
+ case DRV_OPEN:
+ lp2 = (DWORD)MapLS((void*)lp2);
+ break;
+ }
+ args[7] = HIWORD(hic);
+ args[6] = LOWORD(hic);
+ args[5] = HDRVR_16(hdrv);
+ args[4] = msg;
+ args[3] = HIWORD(lp1);
+ args[2] = LOWORD(lp1);
+ args[1] = HIWORD(lp2);
+ args[0] = LOWORD(lp2);
+ WOWCallback16Ex( pfn16, WCB16_PASCAL, sizeof(args), args, &ret );
+
+ switch (msg)
+ {
+ case DRV_OPEN:
+ UnMapLS(lp2);
+ break;
+ }
+ return ret;
+}
+
+#define MAX_THUNKS 32
+
+static struct msvideo_thunk
+{
+ BYTE popl_eax; /* popl %eax (return address) */
+ BYTE pushl_func; /* pushl $pfn16 (16bit callback function) */
+ DWORD pfn16;
+ BYTE pushl_eax; /* pushl %eax */
+ BYTE jmp; /* ljmp WDML_InvokeCallback16 */
+ DWORD callback;
+ HIC16 hIC16; /* driver's handle */
+} *MSVIDEO_Thunks;
+
+static CRITICAL_SECTION msvideo_cs;
+static CRITICAL_SECTION_DEBUG critsect_debug =
+{
+ 0, 0, &msvideo_cs,
+ { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": msvideo_cs") }
+};
+static CRITICAL_SECTION msvideo_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
+
+static struct msvideo_thunk* MSVIDEO_AddThunk(DWORD pfn16)
+{
+ struct msvideo_thunk* thunk;
+
+ if (!MSVIDEO_Thunks)
+ {
+ MSVIDEO_Thunks = VirtualAlloc(NULL, MAX_THUNKS * sizeof(*MSVIDEO_Thunks), MEM_COMMIT,
+ PAGE_EXECUTE_READWRITE);
+ if (!MSVIDEO_Thunks) return NULL;
+ for (thunk = MSVIDEO_Thunks; thunk < &MSVIDEO_Thunks[MAX_THUNKS]; thunk++)
+ {
+ thunk->popl_eax = 0x58; /* popl %eax */
+ thunk->pushl_func = 0x68; /* pushl $pfn16 */
+ thunk->pfn16 = 0;
+ thunk->pushl_eax = 0x50; /* pushl %eax */
+ thunk->jmp = 0xe9; /* jmp IC_Callback3216 */
+ thunk->callback = (char *)IC_Callback3216 - (char *)(&thunk->callback + 1);
+ thunk->hIC16 = 0;
+ }
+ }
+ for (thunk = MSVIDEO_Thunks; thunk < &MSVIDEO_Thunks[MAX_THUNKS]; thunk++)
+ {
+ if (thunk->pfn16 == 0)
+ {
+ thunk->pfn16 = pfn16;
+ return thunk;
+ }
+ }
+ FIXME("Out of msvideo-thunks. Bump MAX_THUNKS\n");
+ return NULL;
+}
+
+static struct msvideo_thunk* MSVIDEO_HasThunk(HIC16 hic)
+{
+ struct msvideo_thunk* thunk;
+
+ for (thunk = MSVIDEO_Thunks; thunk < &MSVIDEO_Thunks[MAX_THUNKS]; thunk++)
+ {
+ if (thunk->hIC16 == hic) return thunk;
+ }
+ return NULL;
+}
+
+/***********************************************************************
+ * ICOpenFunction [MSVIDEO.206]
+ */
+HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler)
+{
+ HIC hic32;
+ struct msvideo_thunk* thunk;
+
+ EnterCriticalSection(&msvideo_cs);
+ if (!(thunk = MSVIDEO_AddThunk((DWORD)lpfnHandler))) return 0;
+ if ((hic32 = ICOpenFunction(fccType, fccHandler, wMode, IC_Callback3216)))
+ thunk->hIC16 = HIC_16(hic32);
+ else
+ thunk->pfn16 = 0;
+ LeaveCriticalSection(&msvideo_cs);
+ return HIC_16(hic32);
+}
+
+/***********************************************************************
+ * ICSendMessage [MSVIDEO.205]
+ */
+LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2)
+{
+ LRESULT ret = ICERR_BADHANDLE;
+ struct msvideo_thunk* thunk;
+
+ if ((thunk = MSVIDEO_HasThunk(hic)))
+ {
+ WORD args[8];
+ DWORD result;
+
+ /* FIXME: original code was passing hdrv first and hic second */
+ /* but this doesn't match what IC_Callback3216 does */
+ args[7] = HIWORD(hic);
+ args[6] = LOWORD(hic);
+ args[5] = 0; /* the 32bit also sets it to NULL */
+ args[4] = msg;
+ args[3] = HIWORD(lParam1);
+ args[2] = LOWORD(lParam1);
+ args[1] = HIWORD(lParam2);
+ args[0] = LOWORD(lParam2);
+ WOWCallback16Ex( thunk->pfn16, WCB16_PASCAL, sizeof(args), args, &result );
+ ret = result;
+ }
+ else
+ {
+ /* map the message for a 32 bit infrastructure, and pass it along */
+ void* data16 = MSVIDEO_MapMsg16To32(msg, &lParam1, &lParam2);
+
+ ret = ICSendMessage(HIC_32(hic), msg, lParam1, lParam2);
+ if (data16)
+ MSVIDEO_UnmapMsg16To32(msg, data16, &lParam1, &lParam2);
+ }
+ return ret;
+}
+
+/***********************************************************************
+ * ICClose [MSVIDEO.204]
+ */
+LRESULT WINAPI ICClose16(HIC16 hic)
+{
+ BOOL ret = ICClose(HIC_32(hic));
+
+ EnterCriticalSection(&msvideo_cs);
+ if (ret)
+ {
+ struct msvideo_thunk* thunk;
+ if ((thunk = MSVIDEO_HasThunk(hic)))
+ {
+ thunk->pfn16 = 0;
+ thunk->hIC16 = 0;
+ }
+ else ret = FALSE;
+ }
+ LeaveCriticalSection(&msvideo_cs);
+ return ret;
+}
+
+/***********************************************************************
+ * VideoCapDriverDescAndVer [MSVIDEO.22]
+ */
+DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len,
+ LPSTR buf2, WORD buf2len)
+{
+ static const char version_info_spec[] = "\\StringFileInfo\\040904E4\\FileDescription";
+ DWORD verhandle;
+ DWORD infosize;
+ UINT subblocklen;
+ char *s, buf[2048], fn[260];
+ LPBYTE infobuf;
+ LPVOID subblock;
+ DWORD i, cnt = 0, lRet;
+ DWORD bufLen, fnLen;
+ FILETIME lastWrite;
+ HKEY hKey;
+ BOOL found = FALSE;
+
+ TRACE("(%d,%p,%d,%p,%d)\n", nr, buf1, buf1len, buf2, buf2len);
+ lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey);
+ if (lRet == ERROR_SUCCESS)
+ {
+ RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0);
+ for (i = 0; i < cnt; i++)
+ {
+ bufLen = sizeof(buf) / sizeof(buf[0]);
+ lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite);
+ if (lRet != ERROR_SUCCESS) continue;
+ if (strncasecmp(buf, "vid", 3)) continue;
+ if (nr--) continue;
+ fnLen = sizeof(fn);
+ lRet = RegQueryValueExA(hKey, buf, 0, 0, (LPBYTE)fn, &fnLen);
+ if (lRet == ERROR_SUCCESS) found = TRUE;
+ break;
+ }
+ RegCloseKey( hKey );
+ }
+
+ /* search system.ini if not found in the registry */
+ if (!found && GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini"))
+ {
+ for (s = buf; *s; s += strlen(s) + 1)
+ {
+ if (strncasecmp(s, "vid", 3)) continue;
+ if (nr--) continue;
+ if (GetPrivateProfileStringA("drivers32", s, NULL, fn, sizeof(fn), "system.ini"))
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ TRACE("No more VID* entries found nr=%d\n", nr);
+ return 20;
+ }
+ 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))
+ {
+ /* Yes, two space behind : */
+ /* FIXME: test for buflen */
+ snprintf(buf2, buf2len, "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, buf2);
+ }
+ else
+ {
+ TRACE("GetFileVersionInfoA failed for %s.\n", fn);
+ lstrcpynA(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/
+ }
+ /* FIXME: language problem? */
+ if (VerQueryValueA( infobuf,
+ version_info_spec,
+ &subblock,
+ &subblocklen
+ ))
+ {
+ UINT copylen = min(subblocklen,buf1len-1);
+ memcpy(buf1, subblock, copylen);
+ buf1[copylen] = '\0';
+ TRACE("VQA returned %s\n", (LPCSTR)subblock);
+ }
+ else
+ {
+ TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n");
+ lstrcpynA(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/
+ }
+ HeapFree(GetProcessHeap(), 0, infobuf);
+ return 0;
+}
+
+/**************************************************************************
+ * DllEntryPoint (MSVIDEO.3)
+ *
+ * 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:
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ break;
+ }
+ return TRUE;
+}
More information about the wine-patches
mailing list