2 * msvideo 16-bit functions
4 * Copyright 1998 Marcus Meissner
5 * Copyright 2000 Bradley Baetz
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #define COM_NO_WINDOWS_H
34 #include "msvideo_private.h"
35 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(msvideo
);
39 /* Drivers32 settings */
40 #define HKLM_DRIVERS32 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32"
42 /***********************************************************************
43 * DrawDibOpen [MSVIDEO.102]
45 HDRAWDIB16 VFWAPI
DrawDibOpen16(void)
47 return HDRAWDIB_16(DrawDibOpen());
50 /***********************************************************************
51 * DrawDibClose [MSVIDEO.103]
53 BOOL16 VFWAPI
DrawDibClose16(HDRAWDIB16 hdd
)
55 return DrawDibClose(HDRAWDIB_32(hdd
));
58 /************************************************************************
59 * DrawDibBegin [MSVIDEO.104]
61 BOOL16 VFWAPI
DrawDibBegin16(HDRAWDIB16 hdd
, HDC16 hdc
, INT16 dxDst
,
62 INT16 dyDst
, LPBITMAPINFOHEADER lpbi
, INT16 dxSrc
,
63 INT16 dySrc
, UINT16 wFlags
)
65 return DrawDibBegin(HDRAWDIB_32(hdd
), HDC_32(hdc
), dxDst
, dyDst
, lpbi
,
66 dxSrc
, dySrc
, wFlags
);
69 /***********************************************************************
70 * DrawDibEnd [MSVIDEO.105]
72 BOOL16 VFWAPI
DrawDibEnd16(HDRAWDIB16 hdd
)
74 return DrawDibEnd(HDRAWDIB_32(hdd
));
77 /**********************************************************************
78 * DrawDibDraw [MSVIDEO.106]
80 BOOL16 VFWAPI
DrawDibDraw16(HDRAWDIB16 hdd
, HDC16 hdc
, INT16 xDst
, INT16 yDst
,
81 INT16 dxDst
, INT16 dyDst
, LPBITMAPINFOHEADER lpbi
,
82 LPVOID lpBits
, INT16 xSrc
, INT16 ySrc
, INT16 dxSrc
,
83 INT16 dySrc
, UINT16 wFlags
)
85 return DrawDibDraw(HDRAWDIB_32(hdd
), HDC_32(hdc
), xDst
, yDst
, dxDst
,
86 dyDst
, lpbi
, lpBits
, xSrc
, ySrc
, dxSrc
, dySrc
, wFlags
);
89 /***********************************************************************
90 * DrawDibGetPalette [MSVIDEO.108]
92 HPALETTE16 VFWAPI
DrawDibGetPalette16(HDRAWDIB16 hdd
)
94 return HPALETTE_16(DrawDibGetPalette(HDRAWDIB_32(hdd
)));
97 /***********************************************************************
98 * DrawDibSetPalette [MSVIDEO.110]
100 BOOL16 VFWAPI
DrawDibSetPalette16(HDRAWDIB16 hdd
, HPALETTE16 hpal
)
102 return DrawDibSetPalette(HDRAWDIB_32(hdd
), HPALETTE_32(hpal
));
105 /***********************************************************************
106 * DrawDibRealize [MSVIDEO.112]
108 UINT16 VFWAPI
DrawDibRealize16(HDRAWDIB16 hdd
, HDC16 hdc
,
111 return (UINT16
)DrawDibRealize(HDRAWDIB_32(hdd
), HDC_32(hdc
), fBackground
);
114 /*************************************************************************
115 * DrawDibStart [MSVIDEO.118]
117 BOOL16 VFWAPI
DrawDibStart16(HDRAWDIB16 hdd
, DWORD rate
)
119 return DrawDibStart(HDRAWDIB_32(hdd
), rate
);
122 /*************************************************************************
123 * DrawDibStop [MSVIDEO.119]
125 BOOL16 VFWAPI
DrawDibStop16(HDRAWDIB16 hdd
)
127 return DrawDibStop(HDRAWDIB_32(hdd
));
130 /***********************************************************************
131 * ICOpen [MSVIDEO.203]
133 HIC16 VFWAPI
ICOpen16(DWORD fccType
, DWORD fccHandler
, UINT16 wMode
)
135 return HIC_16(ICOpen(fccType
, fccHandler
, wMode
));
138 /***********************************************************************
139 * ICClose [MSVIDEO.204]
141 LRESULT WINAPI
ICClose16(HIC16 hic
)
143 return ICClose(HIC_32(hic
));
146 /***********************************************************************
147 * _ICMessage [MSVIDEO.207]
149 LRESULT VFWAPIV
ICMessage16( HIC16 hic
, UINT16 msg
, UINT16 cb
, VA_LIST16 valist
)
156 lpData
= HeapAlloc(GetProcessHeap(), 0, cb
);
158 TRACE("0x%08x, %u, %u, ...)\n", (DWORD
) hic
, msg
, cb
);
160 for (i
= 0; i
< cb
/ sizeof(WORD
); i
++)
162 lpData
[i
] = VA_ARG16(valist
, WORD
);
165 segData
= MapLS(lpData
);
166 ret
= ICSendMessage16(hic
, msg
, segData
, (DWORD
) cb
);
168 HeapFree(GetProcessHeap(), 0, lpData
);
172 /***********************************************************************
173 * ICGetInfo [MSVIDEO.212]
175 LRESULT VFWAPI
ICGetInfo16(HIC16 hic
, ICINFO16
* picinfo
, DWORD cb
)
179 TRACE("(0x%08x,%p,%d)\n", (DWORD
) hic
, picinfo
, cb
);
180 ret
= ICSendMessage16(hic
, ICM_GETINFO
, (DWORD
) picinfo
, cb
);
181 TRACE(" -> 0x%08lx\n", ret
);
185 /***********************************************************************
186 * ICLocate [MSVIDEO.213]
188 HIC16 VFWAPI
ICLocate16(DWORD fccType
, DWORD fccHandler
,
189 LPBITMAPINFOHEADER lpbiIn
, LPBITMAPINFOHEADER lpbiOut
,
192 return HIC_16(ICLocate(fccType
, fccHandler
, lpbiIn
, lpbiOut
, wFlags
));
195 /***********************************************************************
196 * _ICCompress [MSVIDEO.224]
198 DWORD VFWAPIV
ICCompress16(HIC16 hic
, DWORD dwFlags
,
199 LPBITMAPINFOHEADER lpbiOutput
, LPVOID lpData
,
200 LPBITMAPINFOHEADER lpbiInput
, LPVOID lpBits
,
201 LPDWORD lpckid
, LPDWORD lpdwFlags
,
202 LONG lFrameNum
, DWORD dwFrameSize
,
203 DWORD dwQuality
, LPBITMAPINFOHEADER lpbiPrev
,
210 TRACE("(0x%08x,%d,%p,%p,%p,%p,...)\n", (DWORD
) hic
, dwFlags
,
211 lpbiOutput
, lpData
, lpbiInput
, lpBits
);
213 iccmp
.dwFlags
= dwFlags
;
215 iccmp
.lpbiOutput
= lpbiOutput
;
216 iccmp
.lpOutput
= lpData
;
217 iccmp
.lpbiInput
= lpbiInput
;
218 iccmp
.lpInput
= lpBits
;
220 iccmp
.lpckid
= lpckid
;
221 iccmp
.lpdwFlags
= lpdwFlags
;
222 iccmp
.lFrameNum
= lFrameNum
;
223 iccmp
.dwFrameSize
= dwFrameSize
;
224 iccmp
.dwQuality
= dwQuality
;
225 iccmp
.lpbiPrev
= lpbiPrev
;
226 iccmp
.lpPrev
= lpPrev
;
227 seg_iccmp
= MapLS(&iccmp
);
228 ret
= ICSendMessage16(hic
, ICM_COMPRESS
, seg_iccmp
, sizeof(ICCOMPRESS
));
233 /***********************************************************************
234 * _ICDecompress [MSVIDEO.230]
236 DWORD VFWAPIV
ICDecompress16(HIC16 hic
, DWORD dwFlags
,
237 LPBITMAPINFOHEADER lpbiFormat
, LPVOID lpData
,
238 LPBITMAPINFOHEADER lpbi
, LPVOID lpBits
)
244 TRACE("(0x%08x,%d,%p,%p,%p,%p)\n", (DWORD
) hic
, dwFlags
, lpbiFormat
,
245 lpData
, lpbi
, lpBits
);
247 icd
.dwFlags
= dwFlags
;
248 icd
.lpbiInput
= lpbiFormat
;
249 icd
.lpInput
= lpData
;
250 icd
.lpbiOutput
= lpbi
;
251 icd
.lpOutput
= lpBits
;
253 segptr
= MapLS(&icd
);
254 ret
= ICSendMessage16(hic
, ICM_DECOMPRESS
, segptr
, sizeof(ICDECOMPRESS
));
259 /***********************************************************************
260 * _ICDrawBegin [MSVIDEO.232]
262 DWORD VFWAPIV
ICDrawBegin16(HIC16 hic
, /* [in] */
263 DWORD dwFlags
, /* [in] flags */
264 HPALETTE16 hpal
, /* [in] palette to draw with */
265 HWND16 hwnd
, /* [in] window to draw to */
266 HDC16 hdc
, /* [in] HDC to draw to */
267 INT16 xDst
, /* [in] destination rectangle */
268 INT16 yDst
, /* [in] */
269 INT16 dxDst
, /* [in] */
270 INT16 dyDst
, /* [in] */
271 LPBITMAPINFOHEADER lpbi
, /* [in] format of frame to draw NOTE: SEGPTR */
272 INT16 xSrc
, /* [in] source rectangle */
273 INT16 ySrc
, /* [in] */
274 INT16 dxSrc
, /* [in] */
275 INT16 dySrc
, /* [in] */
276 DWORD dwRate
, /* [in] frames/second = (dwRate/dwScale) */
277 DWORD dwScale
) /* [in] */
283 TRACE ("(0x%08x,%d,0x%08x,0x%08x,0x%08x,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n",
284 (DWORD
) hic
, dwFlags
, (DWORD
) hpal
, (DWORD
) hwnd
, (DWORD
) hdc
,
285 xDst
, yDst
, dxDst
, dyDst
, lpbi
, xSrc
, ySrc
, dxSrc
, dySrc
, dwRate
,
288 icdb
.dwFlags
= dwFlags
;
296 icdb
.lpbi
= lpbi
; /* Keep this as SEGPTR for the mapping code to deal with */
301 icdb
.dwRate
= dwRate
;
302 icdb
.dwScale
= dwScale
;
303 seg_icdb
= MapLS(&icdb
);
304 ret
= (DWORD
) ICSendMessage16(hic
, ICM_DRAW_BEGIN
, seg_icdb
,
305 sizeof(ICDRAWBEGIN16
));
310 /***********************************************************************
311 * _ICDraw [MSVIDEO.234]
313 DWORD VFWAPIV
ICDraw16(HIC16 hic
, DWORD dwFlags
,
314 LPVOID lpFormat
, /* [???] NOTE: SEGPTR */
315 LPVOID lpData
, /* [???] NOTE: SEGPTR */
316 DWORD cbData
, LONG lTime
)
322 TRACE("(0x%08x,0x%08x,%p,%p,%d,%d)\n", (DWORD
) hic
, dwFlags
,
323 lpFormat
, lpData
, cbData
, lTime
);
324 icd
.dwFlags
= dwFlags
;
325 icd
.lpFormat
= lpFormat
;
329 seg_icd
= MapLS(&icd
);
330 ret
= ICSendMessage16(hic
, ICM_DRAW
, seg_icd
, sizeof(ICDRAW
));
335 /***********************************************************************
336 * ICGetDisplayFormat [MSVIDEO.239]
338 HIC16 VFWAPI
ICGetDisplayFormat16(HIC16 hic
, LPBITMAPINFOHEADER lpbiIn
,
339 LPBITMAPINFOHEADER lpbiOut
, INT16 depth
,
342 return HIC_16(ICGetDisplayFormat(HIC_32(hic
), lpbiIn
, lpbiOut
, depth
,
346 #define COPY(x,y) (x->y = x##16->y);
347 #define COPYPTR(x,y) (x->y = MapSL((SEGPTR)x##16->y));
349 /******************************************************************
350 * MSVIDEO_MapICDEX16To32
354 static LPVOID
MSVIDEO_MapICDEX16To32(LPDWORD lParam
)
358 ICDECOMPRESSEX
*icdx
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESSEX
));
359 ICDECOMPRESSEX16
*icdx16
= MapSL(*lParam
);
363 COPYPTR(icdx
, lpbiSrc
);
364 COPYPTR(icdx
, lpSrc
);
365 COPYPTR(icdx
, lpbiDst
);
366 COPYPTR(icdx
, lpDst
);
376 *lParam
= (DWORD
)(icdx
);
380 /******************************************************************
381 * MSVIDEO_MapMsg16To32
385 static LPVOID
MSVIDEO_MapMsg16To32(UINT msg
, LPDWORD lParam1
, LPDWORD lParam2
)
389 TRACE("Mapping %d\n", msg
);
400 case ICM_COMPRESS_END
:
401 case ICM_DECOMPRESS_END
:
402 case ICM_DECOMPRESSEX_END
:
404 case ICM_DRAW_START_PLAY
:
405 case ICM_DRAW_STOP_PLAY
:
406 case ICM_DRAW_REALIZE
:
407 case ICM_DRAW_RENDERBUFFER
:
411 case ICM_GETDEFAULTQUALITY
:
414 case ICM_DRAW_WINDOW
:
415 case ICM_GETBUFFERSWANTED
:
416 *lParam1
= (DWORD
)MapSL(*lParam1
);
420 ICINFO
*ici
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICINFO
));
423 ici16
= MapSL(*lParam1
);
426 ici
->dwSize
= sizeof(ICINFO
);
428 COPY(ici
, fccHandler
);
430 COPY(ici
, dwVersion
);
431 COPY(ici
, dwVersionICM
);
432 MultiByteToWideChar( CP_ACP
, 0, ici16
->szName
, -1, ici
->szName
, 16 );
433 MultiByteToWideChar( CP_ACP
, 0, ici16
->szDescription
, -1, ici
->szDescription
, 128 );
434 MultiByteToWideChar( CP_ACP
, 0, ici16
->szDriver
, -1, ici
->szDriver
, 128 );
435 *lParam1
= (DWORD
)(ici
);
436 *lParam2
= sizeof(ICINFO
);
441 ICCOMPRESS
*icc
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS
));
444 icc16
= MapSL(*lParam1
);
448 COPYPTR(icc
, lpbiOutput
);
449 COPYPTR(icc
, lpOutput
);
450 COPYPTR(icc
, lpbiInput
);
451 COPYPTR(icc
, lpInput
);
452 COPYPTR(icc
, lpckid
);
453 COPYPTR(icc
, lpdwFlags
);
454 COPY(icc
, lFrameNum
);
455 COPY(icc
, dwFrameSize
);
456 COPY(icc
, dwQuality
);
457 COPYPTR(icc
, lpbiPrev
);
458 COPYPTR(icc
, lpPrev
);
460 *lParam1
= (DWORD
)(icc
);
461 *lParam2
= sizeof(ICCOMPRESS
);
466 ICDECOMPRESS
*icd
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS
));
467 ICDECOMPRESS
*icd16
; /* Same structure except for the pointers */
469 icd16
= MapSL(*lParam1
);
473 COPYPTR(icd
, lpbiInput
);
474 COPYPTR(icd
, lpInput
);
475 COPYPTR(icd
, lpbiOutput
);
476 COPYPTR(icd
, lpOutput
);
479 *lParam1
= (DWORD
)(icd
);
480 *lParam2
= sizeof(ICDECOMPRESS
);
483 case ICM_COMPRESS_BEGIN
:
484 case ICM_COMPRESS_GET_FORMAT
:
485 case ICM_COMPRESS_GET_SIZE
:
486 case ICM_COMPRESS_QUERY
:
487 case ICM_DECOMPRESS_GET_FORMAT
:
488 case ICM_DECOMPRESS_QUERY
:
489 case ICM_DECOMPRESS_BEGIN
:
490 case ICM_DECOMPRESS_SET_PALETTE
:
491 case ICM_DECOMPRESS_GET_PALETTE
:
492 *lParam1
= (DWORD
)MapSL(*lParam1
);
493 *lParam2
= (DWORD
)MapSL(*lParam2
);
495 case ICM_DECOMPRESSEX_QUERY
:
496 if ((*lParam2
!= sizeof(ICDECOMPRESSEX16
)) && (*lParam2
!= 0))
497 WARN("*lParam2 has unknown value %p\n", (ICDECOMPRESSEX16
*)*lParam2
);
498 /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16)
499 * This is because of ICMessage(). Special case it?
501 LPVOID* addr = HeapAlloc(GetProcessHeap(), 0, 2*sizeof(LPVOID));
502 addr[0] = MSVIDEO_MapICDEX16To32(lParam1);
504 addr[1] = MSVIDEO_MapICDEX16To32(lParam2);
511 case ICM_DECOMPRESSEX_BEGIN
:
512 case ICM_DECOMPRESSEX
:
513 ret
= MSVIDEO_MapICDEX16To32(lParam1
);
514 *lParam2
= sizeof(ICDECOMPRESSEX
);
518 ICDRAWBEGIN
*icdb
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN
));
519 ICDRAWBEGIN16
*icdb16
= MapSL(*lParam1
);
523 icdb
->hpal
= HPALETTE_32(icdb16
->hpal
);
524 icdb
->hwnd
= HWND_32(icdb16
->hwnd
);
525 icdb
->hdc
= HDC_32(icdb16
->hdc
);
538 *lParam1
= (DWORD
)(icdb
);
539 *lParam2
= sizeof(ICDRAWBEGIN
);
542 case ICM_DRAW_SUGGESTFORMAT
:
544 ICDRAWSUGGEST
*icds
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWSUGGEST
));
545 ICDRAWSUGGEST16
*icds16
= MapSL(*lParam1
);
550 COPYPTR(icds
, lpbiIn
);
551 COPYPTR(icds
, lpbiSuggest
);
556 icds
->hicDecompressor
= HIC_32(icds16
->hicDecompressor
);
558 *lParam1
= (DWORD
)(icds
);
559 *lParam2
= sizeof(ICDRAWSUGGEST
);
564 ICDRAW
*icd
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAW
));
565 ICDRAW
*icd16
= MapSL(*lParam1
);
569 COPYPTR(icd
, lpFormat
);
570 COPYPTR(icd
, lpData
);
574 *lParam1
= (DWORD
)(icd
);
575 *lParam2
= sizeof(ICDRAW
);
582 FIXME("%d is not yet handled. Expect a crash.\n", msg
);
590 /******************************************************************
591 * MSVIDEO_UnmapMsg16To32
595 static void MSVIDEO_UnmapMsg16To32(UINT msg
, LPVOID data16
, LPDWORD lParam1
, LPDWORD lParam2
)
597 TRACE("Unmapping %d\n", msg
);
599 #define UNCOPY(x, y) (x##16->y = x->y);
605 ICINFO
*ici
= (ICINFO
*)(*lParam1
);
606 ICINFO16
*ici16
= (ICINFO16
*)data16
;
608 UNCOPY(ici
, fccType
);
609 UNCOPY(ici
, fccHandler
);
610 UNCOPY(ici
, dwFlags
);
611 UNCOPY(ici
, dwVersion
);
612 UNCOPY(ici
, dwVersionICM
);
613 WideCharToMultiByte( CP_ACP
, 0, ici
->szName
, -1, ici16
->szName
,
614 sizeof(ici16
->szName
), NULL
, NULL
);
615 ici16
->szName
[sizeof(ici16
->szName
)-1] = 0;
616 WideCharToMultiByte( CP_ACP
, 0, ici
->szDescription
, -1, ici16
->szDescription
,
617 sizeof(ici16
->szDescription
), NULL
, NULL
);
618 ici16
->szDescription
[sizeof(ici16
->szDescription
)-1] = 0;
619 /* This just gives garbage for some reason - BB
620 lstrcpynWtoA(ici16->szDriver, ici->szDriver, 128);*/
622 HeapFree(GetProcessHeap(), 0, ici
);
625 case ICM_DECOMPRESS_QUERY
:
628 HeapFree(GetProcessHeap(), 0, x[0]);
630 HeapFree(GetProcessHeap(), 0, x[1]);
635 case ICM_DECOMPRESSEX_QUERY
:
636 case ICM_DECOMPRESSEX_BEGIN
:
637 case ICM_DECOMPRESSEX
:
639 case ICM_DRAW_SUGGESTFORMAT
:
641 HeapFree(GetProcessHeap(), 0, data16
);
644 ERR("Unmapping unmapped msg %d\n", msg
);
649 /***********************************************************************
650 * ICInfo [MSVIDEO.200]
652 BOOL16 VFWAPI
ICInfo16(DWORD fccType
, DWORD fccHandler
, ICINFO16
*lpicinfo
)
656 DWORD lParam
= (DWORD
)lpicinfo
;
657 DWORD size
= ((ICINFO
*)(MapSL((SEGPTR
)lpicinfo
)))->dwSize
;
659 /* Use the mapping functions to map the ICINFO structure */
660 lpv
= MSVIDEO_MapMsg16To32(ICM_GETINFO
, &lParam
, &size
);
662 ret
= ICInfo(fccType
, fccHandler
, (ICINFO
*)lParam
);
664 MSVIDEO_UnmapMsg16To32(ICM_GETINFO
, lpv
, &lParam
, &size
);
669 /******************************************************************
674 static LRESULT CALLBACK
IC_Callback3216(HIC hic
, HDRVR hdrv
, UINT msg
, DWORD lp1
, DWORD lp2
)
679 whic
= MSVIDEO_GetHicPtr(hic
);
686 lp2
= (DWORD
)MapLS((void*)lp2
);
689 args
[7] = HIWORD(hic
);
690 args
[6] = LOWORD(hic
);
691 args
[5] = HDRVR_16(whic
->hdrv
);
693 args
[3] = HIWORD(lp1
);
694 args
[2] = LOWORD(lp1
);
695 args
[1] = HIWORD(lp2
);
696 args
[0] = LOWORD(lp2
);
697 WOWCallback16Ex( (DWORD
)whic
->driverproc16
, WCB16_PASCAL
, sizeof(args
), args
, &ret
);
707 else return ICERR_BADHANDLE
;
710 /***********************************************************************
711 * ICOpenFunction [MSVIDEO.206]
713 HIC16 VFWAPI
ICOpenFunction16(DWORD fccType
, DWORD fccHandler
, UINT16 wMode
, FARPROC16 lpfnHandler
)
717 hic32
= MSVIDEO_OpenFunction(fccType
, fccHandler
, wMode
,
718 (DRIVERPROC
)IC_Callback3216
, (DWORD
)lpfnHandler
);
719 return HIC_16(hic32
);
722 /***********************************************************************
723 * ICSendMessage [MSVIDEO.205]
725 LRESULT VFWAPI
ICSendMessage16(HIC16 hic
, UINT16 msg
, DWORD lParam1
, DWORD lParam2
)
727 LRESULT ret
= ICERR_BADHANDLE
;
730 whic
= MSVIDEO_GetHicPtr(HIC_32(hic
));
733 /* we've got a 16 bit driver proc... call it directly */
734 if (whic
->driverproc16
)
739 /* FIXME: original code was passing hdrv first and hic second */
740 /* but this doesn't match what IC_Callback3216 does */
741 args
[7] = HIWORD(hic
);
742 args
[6] = LOWORD(hic
);
743 args
[5] = HDRVR_16(whic
->hdrv
);
745 args
[3] = HIWORD(lParam1
);
746 args
[2] = LOWORD(lParam1
);
747 args
[1] = HIWORD(lParam2
);
748 args
[0] = LOWORD(lParam2
);
749 WOWCallback16Ex( (DWORD
)whic
->driverproc16
, WCB16_PASCAL
, sizeof(args
), args
, &result
);
754 /* map the message for a 32 bit infrastructure, and pass it along */
755 void* data16
= MSVIDEO_MapMsg16To32(msg
, &lParam1
, &lParam2
);
757 ret
= MSVIDEO_SendMessage(whic
, msg
, lParam1
, lParam2
);
759 MSVIDEO_UnmapMsg16To32(msg
, data16
, &lParam1
, &lParam2
);
765 /***********************************************************************
766 * VideoCapDriverDescAndVer [MSVIDEO.22]
768 DWORD WINAPI
VideoCapDriverDescAndVer16(WORD nr
, LPSTR buf1
, WORD buf1len
,
769 LPSTR buf2
, WORD buf2len
)
774 char *s
, buf
[2048], fn
[260];
775 static char version_info_spec
[] = "\\StringFileInfo\\040904E4\\FileDescription";
778 DWORD i
, cnt
= 0, lRet
;
784 TRACE("(%d,%p,%d,%p,%d)\n", nr
, buf1
, buf1len
, buf2
, buf2len
);
785 lRet
= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, HKLM_DRIVERS32
, 0, KEY_QUERY_VALUE
, &hKey
);
786 if (lRet
== ERROR_SUCCESS
)
788 RegQueryInfoKeyA( hKey
, 0, 0, 0, &cnt
, 0, 0, 0, 0, 0, 0, 0);
789 for (i
= 0; i
< cnt
; i
++)
791 bufLen
= sizeof(buf
) / sizeof(buf
[0]);
792 lRet
= RegEnumKeyExA(hKey
, i
, buf
, &bufLen
, 0, 0, 0, &lastWrite
);
793 if (lRet
!= ERROR_SUCCESS
) continue;
794 if (strncasecmp(buf
, "vid", 3)) continue;
797 lRet
= RegQueryValueExA(hKey
, buf
, 0, 0, (LPBYTE
)fn
, &fnLen
);
798 if (lRet
== ERROR_SUCCESS
) found
= TRUE
;
804 /* search system.ini if not found in the registry */
805 if (!found
&& GetPrivateProfileStringA("drivers32", NULL
, NULL
, buf
, sizeof(buf
), "system.ini"))
807 for (s
= buf
; *s
; s
+= strlen(s
) + 1)
809 if (strncasecmp(s
, "vid", 3)) continue;
811 if (GetPrivateProfileStringA("drivers32", s
, NULL
, fn
, sizeof(fn
), "system.ini"))
819 TRACE("No more VID* entries found nr=%d\n", nr
);
822 infosize
= GetFileVersionInfoSizeA(fn
, &verhandle
);
825 TRACE("%s has no fileversioninfo.\n", fn
);
828 infobuf
= HeapAlloc(GetProcessHeap(), 0, infosize
);
829 if (GetFileVersionInfoA(fn
, verhandle
, infosize
, infobuf
))
831 /* Yes, two space behind : */
832 /* FIXME: test for buflen */
833 snprintf(buf2
, buf2len
, "Version: %d.%d.%d.%d\n",
834 ((WORD
*)infobuf
)[0x0f],
835 ((WORD
*)infobuf
)[0x0e],
836 ((WORD
*)infobuf
)[0x11],
837 ((WORD
*)infobuf
)[0x10]
839 TRACE("version of %s is %s\n", fn
, buf2
);
843 TRACE("GetFileVersionInfoA failed for %s.\n", fn
);
844 lstrcpynA(buf2
, fn
, buf2len
); /* msvideo.dll appears to copy fn*/
846 /* FIXME: language problem? */
847 if (VerQueryValueA( infobuf
,
853 UINT copylen
= min(subblocklen
,buf1len
-1);
854 memcpy(buf1
, subblock
, copylen
);
855 buf1
[copylen
] = '\0';
856 TRACE("VQA returned %s\n", (LPCSTR
)subblock
);
860 TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n");
861 lstrcpynA(buf1
, fn
, buf1len
); /* msvideo.dll appears to copy fn*/
863 HeapFree(GetProcessHeap(), 0, infobuf
);
867 /******************************************************************
872 static LRESULT CALLBACK
IC_CallTo16(HDRVR hdrv
, HIC hic
, UINT msg
, LPARAM lp1
, LPARAM lp2
)
875 WINE_HIC
* whic
= IC_GetPtr(hic
);
879 if (whic
->driverproc
)
881 ret
= whic
->driverproc(hic
, whic
->hdrv
, msg
, lParam1
, lParam2
);
885 ret
= SendDriverMessage(whic
->hdrv
, msg
, lParam1
, lParam2
);
888 FIXME("No 32=>16 conversion yet\n");
893 /**************************************************************************
894 * DllEntryPoint (MSVIDEO.3)
896 * MSVIDEO DLL entry point
899 BOOL WINAPI
VIDEO_LibMain(DWORD fdwReason
, HINSTANCE hinstDLL
, WORD ds
,
900 WORD wHeapSize
, DWORD dwReserved1
, WORD wReserved2
)
904 case DLL_PROCESS_ATTACH
:
905 /* hook in our 16 bit management functions */
906 pFnCallTo16
= IC_CallTo16
;
908 case DLL_PROCESS_DETACH
:
909 /* remove our 16 bit management functions */
912 case DLL_THREAD_ATTACH
:
913 case DLL_THREAD_DETACH
: