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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #define COM_NO_WINDOWS_H
26 #include "msvideo_private.h"
29 #include "stackframe.h"
30 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(msvideo
);
34 /* ### start build ### */
35 extern LONG CALLBACK
MSVIDEO_CallTo16_long_lwwll(FARPROC16
, LONG
, WORD
, WORD
, LONG
, LONG
);
36 /* ### stop build ### */
38 /***********************************************************************
39 * DrawDibOpen [MSVIDEO.102]
41 HDRAWDIB16 VFWAPI
DrawDibOpen16(void)
43 return HDRAWDIB_16(DrawDibOpen());
46 /***********************************************************************
47 * DrawDibClose [MSVIDEO.103]
49 BOOL16 VFWAPI
DrawDibClose16(HDRAWDIB16 hdd
)
51 return DrawDibClose(HDRAWDIB_32(hdd
));
54 /************************************************************************
55 * DrawDibBegin [MSVIDEO.104]
57 BOOL16 VFWAPI
DrawDibBegin16(HDRAWDIB16 hdd
, HDC16 hdc
, INT16 dxDst
,
58 INT16 dyDst
, LPBITMAPINFOHEADER lpbi
, INT16 dxSrc
,
59 INT16 dySrc
, UINT16 wFlags
)
61 return DrawDibBegin(HDRAWDIB_32(hdd
), HDC_32(hdc
), dxDst
, dyDst
, lpbi
,
62 dxSrc
, dySrc
, wFlags
);
65 /***********************************************************************
66 * DrawDibEnd [MSVIDEO.105]
68 BOOL16 VFWAPI
DrawDibEnd16(HDRAWDIB16 hdd
)
70 return DrawDibEnd(HDRAWDIB_32(hdd
));
73 /**********************************************************************
74 * DrawDibDraw [MSVIDEO.106]
76 BOOL16 VFWAPI
DrawDibDraw16(HDRAWDIB16 hdd
, HDC16 hdc
, INT16 xDst
, INT16 yDst
,
77 INT16 dxDst
, INT16 dyDst
, LPBITMAPINFOHEADER lpbi
,
78 LPVOID lpBits
, INT16 xSrc
, INT16 ySrc
, INT16 dxSrc
,
79 INT16 dySrc
, UINT16 wFlags
)
81 return DrawDibDraw(HDRAWDIB_32(hdd
), HDC_32(hdc
), xDst
, yDst
, dxDst
,
82 dyDst
, lpbi
, lpBits
, xSrc
, ySrc
, dxSrc
, dySrc
, wFlags
);
85 /***********************************************************************
86 * DrawDibGetPalette [MSVIDEO.108]
88 HPALETTE16 VFWAPI
DrawDibGetPalette16(HDRAWDIB16 hdd
)
90 return HPALETTE_16(DrawDibGetPalette(HDRAWDIB_32(hdd
)));
93 /***********************************************************************
94 * DrawDibSetPalette [MSVIDEO.110]
96 BOOL16 VFWAPI
DrawDibSetPalette16(HDRAWDIB16 hdd
, HPALETTE16 hpal
)
98 return DrawDibSetPalette(HDRAWDIB_32(hdd
), HPALETTE_32(hpal
));
101 /***********************************************************************
102 * DrawDibRealize [MSVIDEO.112]
104 UINT16 VFWAPI
DrawDibRealize16(HDRAWDIB16 hdd
, HDC16 hdc
,
107 return (UINT16
)DrawDibRealize(HDRAWDIB_32(hdd
), HDC_32(hdc
), fBackground
);
110 /*************************************************************************
111 * DrawDibStart [MSVIDEO.118]
113 BOOL16 VFWAPI
DrawDibStart16(HDRAWDIB16 hdd
, DWORD rate
)
115 return DrawDibStart(HDRAWDIB_32(hdd
), rate
);
118 /*************************************************************************
119 * DrawDibStop [MSVIDEO.119]
121 BOOL16
DrawDibStop16(HDRAWDIB16 hdd
)
123 return DrawDibStop(HDRAWDIB_32(hdd
));
126 /***********************************************************************
127 * ICOpen [MSVIDEO.203]
129 HIC16 VFWAPI
ICOpen16(DWORD fccType
, DWORD fccHandler
, UINT16 wMode
)
131 return HIC_16(ICOpen(fccType
, fccHandler
, wMode
));
134 /***********************************************************************
135 * ICClose [MSVIDEO.204]
137 LRESULT WINAPI
ICClose16(HIC16 hic
)
139 return ICClose(HIC_32(hic
));
142 /***********************************************************************
143 * _ICMessage [MSVIDEO.207]
145 LRESULT VFWAPIV
ICMessage16(void)
158 hic
= VA_ARG16(valist
, HIC16
);
159 msg
= VA_ARG16(valist
, UINT16
);
160 cb
= VA_ARG16(valist
, UINT16
);
162 lpData
= HeapAlloc(GetProcessHeap(), 0, cb
);
164 TRACE("0x%08lx, %u, %u, ...)\n", (DWORD
) hic
, msg
, cb
);
166 for (i
= 0; i
< cb
/ sizeof(WORD
); i
++)
168 lpData
[i
] = VA_ARG16(valist
, WORD
);
172 segData
= MapLS(lpData
);
173 ret
= ICSendMessage16(hic
, msg
, segData
, (DWORD
) cb
);
175 HeapFree(GetProcessHeap(), 0, lpData
);
179 /***********************************************************************
180 * ICGetInfo [MSVIDEO.212]
182 LRESULT VFWAPI
ICGetInfo16(HIC16 hic
, ICINFO16
* picinfo
, DWORD cb
)
186 TRACE("(0x%08lx,%p,%ld)\n", (DWORD
) hic
, picinfo
, cb
);
187 ret
= ICSendMessage16(hic
, ICM_GETINFO
, (DWORD
) picinfo
, cb
);
188 TRACE(" -> 0x%08lx\n", ret
);
192 /***********************************************************************
193 * ICLocate [MSVIDEO.213]
195 HIC16 VFWAPI
ICLocate16(DWORD fccType
, DWORD fccHandler
,
196 LPBITMAPINFOHEADER lpbiIn
, LPBITMAPINFOHEADER lpbiOut
,
199 return HIC_16(ICLocate(fccType
, fccHandler
, lpbiIn
, lpbiOut
, wFlags
));
202 /***********************************************************************
203 * _ICCompress [MSVIDEO.224]
205 DWORD VFWAPIV
ICCompress16(HIC16 hic
, DWORD dwFlags
,
206 LPBITMAPINFOHEADER lpbiOutput
, LPVOID lpData
,
207 LPBITMAPINFOHEADER lpbiInput
, LPVOID lpBits
,
208 LPDWORD lpckid
, LPDWORD lpdwFlags
,
209 LONG lFrameNum
, DWORD dwFrameSize
,
210 DWORD dwQuality
, LPBITMAPINFOHEADER lpbiPrev
,
217 TRACE("(0x%08lx,%ld,%p,%p,%p,%p,...)\n", (DWORD
) hic
, dwFlags
,
218 lpbiOutput
, lpData
, lpbiInput
, lpBits
);
220 iccmp
.dwFlags
= dwFlags
;
222 iccmp
.lpbiOutput
= lpbiOutput
;
223 iccmp
.lpOutput
= lpData
;
224 iccmp
.lpbiInput
= lpbiInput
;
225 iccmp
.lpInput
= lpBits
;
227 iccmp
.lpckid
= lpckid
;
228 iccmp
.lpdwFlags
= lpdwFlags
;
229 iccmp
.lFrameNum
= lFrameNum
;
230 iccmp
.dwFrameSize
= dwFrameSize
;
231 iccmp
.dwQuality
= dwQuality
;
232 iccmp
.lpbiPrev
= lpbiPrev
;
233 iccmp
.lpPrev
= lpPrev
;
234 seg_iccmp
= MapLS(&iccmp
);
235 ret
= ICSendMessage16(hic
, ICM_COMPRESS
, seg_iccmp
, sizeof(ICCOMPRESS
));
240 /***********************************************************************
241 * _ICDecompress [MSVIDEO.230]
243 DWORD VFWAPIV
ICDecompress16(HIC16 hic
, DWORD dwFlags
,
244 LPBITMAPINFOHEADER lpbiFormat
, LPVOID lpData
,
245 LPBITMAPINFOHEADER lpbi
, LPVOID lpBits
)
251 TRACE("(0x%08lx,%ld,%p,%p,%p,%p)\n", (DWORD
) hic
, dwFlags
, lpbiFormat
,
252 lpData
, lpbi
, lpBits
);
254 icd
.dwFlags
= dwFlags
;
255 icd
.lpbiInput
= lpbiFormat
;
256 icd
.lpInput
= lpData
;
257 icd
.lpbiOutput
= lpbi
;
258 icd
.lpOutput
= lpBits
;
260 segptr
= MapLS(&icd
);
261 ret
= ICSendMessage16(hic
, ICM_DECOMPRESS
, segptr
, sizeof(ICDECOMPRESS
));
266 /***********************************************************************
267 * _ICDrawBegin [MSVIDEO.232]
269 DWORD VFWAPIV
ICDrawBegin16(HIC16 hic
, /* [in] */
270 DWORD dwFlags
, /* [in] flags */
271 HPALETTE16 hpal
, /* [in] palette to draw with */
272 HWND16 hwnd
, /* [in] window to draw to */
273 HDC16 hdc
, /* [in] HDC to draw to */
274 INT16 xDst
, /* [in] destination rectangle */
275 INT16 yDst
, /* [in] */
276 INT16 dxDst
, /* [in] */
277 INT16 dyDst
, /* [in] */
278 LPBITMAPINFOHEADER lpbi
, /* [in] format of frame to draw NOTE: SEGPTR */
279 INT16 xSrc
, /* [in] source rectangle */
280 INT16 ySrc
, /* [in] */
281 INT16 dxSrc
, /* [in] */
282 INT16 dySrc
, /* [in] */
283 DWORD dwRate
, /* [in] frames/second = (dwRate/dwScale) */
284 DWORD dwScale
) /* [in] */
290 TRACE ("(0x%08lx,%ld,0x%08lx,0x%08lx,0x%08lx,%u,%u,%u,%u,%p,%u,%u,%u,%u,%ld,%ld)\n",
291 (DWORD
) hic
, dwFlags
, (DWORD
) hpal
, (DWORD
) hwnd
, (DWORD
) hdc
,
292 xDst
, yDst
, dxDst
, dyDst
, lpbi
, xSrc
, ySrc
, dxSrc
, dySrc
, dwRate
,
295 icdb
.dwFlags
= dwFlags
;
303 icdb
.lpbi
= lpbi
; /* Keep this as SEGPTR for the mapping code to deal with */
308 icdb
.dwRate
= dwRate
;
309 icdb
.dwScale
= dwScale
;
310 seg_icdb
= MapLS(&icdb
);
311 ret
= (DWORD
) ICSendMessage16(hic
, ICM_DRAW_BEGIN
, seg_icdb
,
312 sizeof(ICDRAWBEGIN16
));
317 /***********************************************************************
318 * _ICDraw [MSVIDEO.234]
320 DWORD VFWAPIV
ICDraw16(HIC16 hic
, DWORD dwFlags
,
321 LPVOID lpFormat
, /* [???] NOTE: SEGPTR */
322 LPVOID lpData
, /* [???] NOTE: SEGPTR */
323 DWORD cbData
, LONG lTime
)
329 TRACE("(0x%08lx,0x%08lx,%p,%p,%ld,%ld)\n", (DWORD
) hic
, dwFlags
,
330 lpFormat
, lpData
, cbData
, lTime
);
331 icd
.dwFlags
= dwFlags
;
332 icd
.lpFormat
= lpFormat
;
336 seg_icd
= MapLS(&icd
);
337 ret
= ICSendMessage16(hic
, ICM_DRAW
, seg_icd
, sizeof(ICDRAW
));
342 /***********************************************************************
343 * ICGetDisplayFormat [MSVIDEO.239]
345 HIC16 VFWAPI
ICGetDisplayFormat16(HIC16 hic
, LPBITMAPINFOHEADER lpbiIn
,
346 LPBITMAPINFOHEADER lpbiOut
, INT16 depth
,
349 return HIC_16(ICGetDisplayFormat(HIC_32(hic
), lpbiIn
, lpbiOut
, depth
,
353 #define COPY(x,y) (x->y = x##16->y);
354 #define COPYPTR(x,y) (x->y = MapSL((SEGPTR)x##16->y));
356 /******************************************************************
357 * MSVIDEO_MapICDEX16To32
361 static LPVOID
MSVIDEO_MapICDEX16To32(LPDWORD lParam
)
365 ICDECOMPRESSEX
*icdx
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESSEX
));
366 ICDECOMPRESSEX16
*icdx16
= MapSL(*lParam
);
370 COPYPTR(icdx
, lpbiSrc
);
371 COPYPTR(icdx
, lpSrc
);
372 COPYPTR(icdx
, lpbiDst
);
373 COPYPTR(icdx
, lpDst
);
383 *lParam
= (DWORD
)(icdx
);
387 /******************************************************************
388 * MSVIDEO_MapMsg16To32
392 static LPVOID
MSVIDEO_MapMsg16To32(UINT msg
, LPDWORD lParam1
, LPDWORD lParam2
)
396 TRACE("Mapping %d\n", msg
);
407 case ICM_COMPRESS_END
:
408 case ICM_DECOMPRESS_END
:
409 case ICM_DECOMPRESSEX_END
:
411 case ICM_DRAW_START_PLAY
:
412 case ICM_DRAW_STOP_PLAY
:
413 case ICM_DRAW_REALIZE
:
414 case ICM_DRAW_RENDERBUFFER
:
418 case ICM_GETDEFAULTQUALITY
:
421 case ICM_DRAW_WINDOW
:
422 case ICM_GETBUFFERSWANTED
:
423 *lParam1
= (DWORD
)MapSL(*lParam1
);
427 ICINFO
*ici
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICINFO
));
430 ici16
= MapSL(*lParam1
);
433 ici
->dwSize
= sizeof(ICINFO
);
435 COPY(ici
, fccHandler
);
437 COPY(ici
, dwVersion
);
438 COPY(ici
, dwVersionICM
);
439 MultiByteToWideChar( CP_ACP
, 0, ici16
->szName
, -1, ici
->szName
, 16 );
440 MultiByteToWideChar( CP_ACP
, 0, ici16
->szDescription
, -1, ici
->szDescription
, 128 );
441 MultiByteToWideChar( CP_ACP
, 0, ici16
->szDriver
, -1, ici
->szDriver
, 128 );
442 *lParam1
= (DWORD
)(ici
);
443 *lParam2
= sizeof(ICINFO
);
448 ICCOMPRESS
*icc
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS
));
451 icc16
= MapSL(*lParam1
);
455 COPYPTR(icc
, lpbiOutput
);
456 COPYPTR(icc
, lpOutput
);
457 COPYPTR(icc
, lpbiInput
);
458 COPYPTR(icc
, lpInput
);
459 COPYPTR(icc
, lpckid
);
460 COPYPTR(icc
, lpdwFlags
);
461 COPY(icc
, lFrameNum
);
462 COPY(icc
, dwFrameSize
);
463 COPY(icc
, dwQuality
);
464 COPYPTR(icc
, lpbiPrev
);
465 COPYPTR(icc
, lpPrev
);
467 *lParam1
= (DWORD
)(icc
);
468 *lParam2
= sizeof(ICCOMPRESS
);
473 ICDECOMPRESS
*icd
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS
));
474 ICDECOMPRESS
*icd16
; /* Same structure except for the pointers */
476 icd16
= MapSL(*lParam1
);
480 COPYPTR(icd
, lpbiInput
);
481 COPYPTR(icd
, lpInput
);
482 COPYPTR(icd
, lpbiOutput
);
483 COPYPTR(icd
, lpOutput
);
486 *lParam1
= (DWORD
)(icd
);
487 *lParam2
= sizeof(ICDECOMPRESS
);
490 case ICM_COMPRESS_BEGIN
:
491 case ICM_COMPRESS_GET_FORMAT
:
492 case ICM_COMPRESS_GET_SIZE
:
493 case ICM_COMPRESS_QUERY
:
494 case ICM_DECOMPRESS_GET_FORMAT
:
495 case ICM_DECOMPRESS_QUERY
:
496 case ICM_DECOMPRESS_BEGIN
:
497 case ICM_DECOMPRESS_SET_PALETTE
:
498 case ICM_DECOMPRESS_GET_PALETTE
:
499 *lParam1
= (DWORD
)MapSL(*lParam1
);
500 *lParam2
= (DWORD
)MapSL(*lParam2
);
502 case ICM_DECOMPRESSEX_QUERY
:
503 if ((*lParam2
!= sizeof(ICDECOMPRESSEX16
)) && (*lParam2
!= 0))
504 WARN("*lParam2 has unknown value %p\n", (ICDECOMPRESSEX16
*)*lParam2
);
505 /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16)
506 * This is because of ICMessage(). Special case it?
508 LPVOID* addr = HeapAlloc(GetProcessHeap(), 0, 2*sizeof(LPVOID));
509 addr[0] = MSVIDEO_MapICDEX16To32(lParam1);
511 addr[1] = MSVIDEO_MapICDEX16To32(lParam2);
518 case ICM_DECOMPRESSEX_BEGIN
:
519 case ICM_DECOMPRESSEX
:
520 ret
= MSVIDEO_MapICDEX16To32(lParam1
);
521 *lParam2
= sizeof(ICDECOMPRESSEX
);
525 ICDRAWBEGIN
*icdb
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN
));
526 ICDRAWBEGIN16
*icdb16
= MapSL(*lParam1
);
530 icdb
->hpal
= HPALETTE_32(icdb16
->hpal
);
531 icdb
->hwnd
= HWND_32(icdb16
->hwnd
);
532 icdb
->hdc
= HDC_32(icdb16
->hdc
);
545 *lParam1
= (DWORD
)(icdb
);
546 *lParam2
= sizeof(ICDRAWBEGIN
);
549 case ICM_DRAW_SUGGESTFORMAT
:
551 ICDRAWSUGGEST
*icds
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWSUGGEST
));
552 ICDRAWSUGGEST16
*icds16
= MapSL(*lParam1
);
557 COPYPTR(icds
, lpbiIn
);
558 COPYPTR(icds
, lpbiSuggest
);
563 icds
->hicDecompressor
= HIC_32(icds16
->hicDecompressor
);
565 *lParam1
= (DWORD
)(icds
);
566 *lParam2
= sizeof(ICDRAWSUGGEST
);
571 ICDRAW
*icd
= HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAW
));
572 ICDRAW
*icd16
= MapSL(*lParam1
);
576 COPYPTR(icd
, lpFormat
);
577 COPYPTR(icd
, lpData
);
581 *lParam1
= (DWORD
)(icd
);
582 *lParam2
= sizeof(ICDRAW
);
589 FIXME("%d is not yet handled. Expect a crash.\n", msg
);
597 /******************************************************************
598 * MSVIDEO_UnmapMsg16To32
602 static void MSVIDEO_UnmapMsg16To32(UINT msg
, LPVOID data16
, LPDWORD lParam1
, LPDWORD lParam2
)
604 TRACE("Unmapping %d\n", msg
);
606 #define UNCOPY(x, y) (x##16->y = x->y);
612 ICINFO
*ici
= (ICINFO
*)(*lParam1
);
613 ICINFO16
*ici16
= (ICINFO16
*)data16
;
615 UNCOPY(ici
, fccType
);
616 UNCOPY(ici
, fccHandler
);
617 UNCOPY(ici
, dwFlags
);
618 UNCOPY(ici
, dwVersion
);
619 UNCOPY(ici
, dwVersionICM
);
620 WideCharToMultiByte( CP_ACP
, 0, ici
->szName
, -1, ici16
->szName
,
621 sizeof(ici16
->szName
), NULL
, NULL
);
622 ici16
->szName
[sizeof(ici16
->szName
)-1] = 0;
623 WideCharToMultiByte( CP_ACP
, 0, ici
->szDescription
, -1, ici16
->szDescription
,
624 sizeof(ici16
->szDescription
), NULL
, NULL
);
625 ici16
->szDescription
[sizeof(ici16
->szDescription
)-1] = 0;
626 /* This just gives garbage for some reason - BB
627 lstrcpynWtoA(ici16->szDriver, ici->szDriver, 128);*/
629 HeapFree(GetProcessHeap(), 0, ici
);
632 case ICM_DECOMPRESS_QUERY
:
635 HeapFree(GetProcessHeap(), 0, x[0]);
637 HeapFree(GetProcessHeap(), 0, x[1]);
642 case ICM_DECOMPRESSEX_QUERY
:
643 case ICM_DECOMPRESSEX_BEGIN
:
644 case ICM_DECOMPRESSEX
:
646 case ICM_DRAW_SUGGESTFORMAT
:
648 HeapFree(GetProcessHeap(), 0, data16
);
651 ERR("Unmapping unmapped msg %d\n", msg
);
656 /***********************************************************************
657 * ICInfo [MSVIDEO.200]
659 BOOL16 VFWAPI
ICInfo16(DWORD fccType
, DWORD fccHandler
, ICINFO16
*lpicinfo
)
663 DWORD lParam
= (DWORD
)lpicinfo
;
664 DWORD size
= ((ICINFO
*)(MapSL((SEGPTR
)lpicinfo
)))->dwSize
;
666 /* Use the mapping functions to map the ICINFO structure */
667 lpv
= MSVIDEO_MapMsg16To32(ICM_GETINFO
, &lParam
, &size
);
669 ret
= ICInfo(fccType
, fccHandler
, (ICINFO
*)lParam
);
671 MSVIDEO_UnmapMsg16To32(ICM_GETINFO
, lpv
, &lParam
, &size
);
676 /******************************************************************
681 static LRESULT CALLBACK
IC_Callback3216(HIC hic
, HDRVR hdrv
, UINT msg
, DWORD lp1
, DWORD lp2
)
686 whic
= MSVIDEO_GetHicPtr(hic
);
692 lp2
= (DWORD
)MapLS((void*)lp2
);
696 ret
= MSVIDEO_CallTo16_long_lwwll((FARPROC16
)whic
->driverproc16
,
697 HIC_16(hic
), HDRVR_16(whic
->hdrv
), msg
, lp1
, lp2
);
705 else ret
= ICERR_BADHANDLE
;
709 /***********************************************************************
710 * ICOpenFunction [MSVIDEO.206]
712 HIC16 VFWAPI
ICOpenFunction16(DWORD fccType
, DWORD fccHandler
, UINT16 wMode
, FARPROC16 lpfnHandler
)
716 hic32
= MSVIDEO_OpenFunction(fccType
, fccHandler
, wMode
,
717 (DRIVERPROC
)IC_Callback3216
, (DWORD
)lpfnHandler
);
718 return HIC_16(hic32
);
721 /***********************************************************************
722 * ICSendMessage [MSVIDEO.205]
724 LRESULT VFWAPI
ICSendMessage16(HIC16 hic
, UINT16 msg
, DWORD lParam1
, DWORD lParam2
)
726 LRESULT ret
= ICERR_BADHANDLE
;
729 whic
= MSVIDEO_GetHicPtr(HIC_32(hic
));
732 /* we've got a 16 bit driver proc... call it directly */
733 if (whic
->driverproc16
)
735 ret
= MSVIDEO_CallTo16_long_lwwll((FARPROC16
)whic
->driverproc16
,
736 (LONG
)whic
->hdrv
, HIC_16(hic
), msg
, lParam1
, lParam2
);
740 /* map the message for a 32 bit infrastructure, and pass it along */
741 void* data16
= MSVIDEO_MapMsg16To32(msg
, &lParam1
, &lParam2
);
743 ret
= MSVIDEO_SendMessage(HIC_32(hic
), msg
, lParam1
, lParam2
);
745 MSVIDEO_UnmapMsg16To32(msg
, data16
, &lParam1
, &lParam2
);
751 /***********************************************************************
752 * VideoCapDriverDescAndVer [MSVIDEO.22]
754 DWORD WINAPI
VideoCapDriverDescAndVer16(WORD nr
, LPSTR buf1
, WORD buf1len
,
755 LPSTR buf2
, WORD buf2len
)
761 char *s
, buf
[2000], fn
[260];
765 TRACE("(%d,%p,%d,%p,%d)\n", nr
, buf1
, buf1len
, buf2
, buf2len
);
766 if (GetPrivateProfileStringA("drivers32", NULL
, NULL
, buf
, sizeof(buf
), "system.ini"))
771 if (!strncasecmp(s
, "vid", 3))
776 s
= s
+ strlen(s
) + 1; /* either next char or \0 */
780 return 20; /* hmm, out of entries even if we don't have any */
783 FIXME("No more VID* entries found\n");
786 GetPrivateProfileStringA("drivers32", s
, NULL
, fn
, sizeof(fn
), "system.ini");
787 infosize
= GetFileVersionInfoSizeA(fn
, &verhandle
);
790 TRACE("%s has no fileversioninfo.\n", fn
);
793 infobuf
= HeapAlloc(GetProcessHeap(), 0, infosize
);
794 if (GetFileVersionInfoA(fn
, verhandle
, infosize
, infobuf
))
797 /* Yes, two space behind : */
798 /* FIXME: test for buflen */
799 sprintf(vbuf
, "Version: %d.%d.%d.%d\n",
800 ((WORD
*)infobuf
)[0x0f],
801 ((WORD
*)infobuf
)[0x0e],
802 ((WORD
*)infobuf
)[0x11],
803 ((WORD
*)infobuf
)[0x10]
805 TRACE("version of %s is %s\n", fn
, vbuf
);
806 strncpy(buf2
, vbuf
, buf2len
);
810 TRACE("GetFileVersionInfoA failed for %s.\n", fn
);
811 strncpy(buf2
, fn
, buf2len
); /* msvideo.dll appears to copy fn*/
813 /* FIXME: language problem? */
814 if (VerQueryValueA( infobuf
,
815 "\\StringFileInfo\\040904E4\\FileDescription",
820 TRACE("VQA returned %s\n", (LPCSTR
)subblock
);
821 strncpy(buf1
, subblock
, buf1len
);
825 TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n");
826 strncpy(buf1
, fn
, buf1len
); /* msvideo.dll appears to copy fn*/
828 HeapFree(GetProcessHeap(), 0, infobuf
);
832 /******************************************************************
837 static LRESULT CALLBACK
IC_CallTo16(HDRVR hdrv
, HIC hic
, UINT msg
, LPARAM lp1
, LPARAM lp2
)
840 WINE_HIC
* whic
= IC_GetPtr(hic
);
844 if (whic
->driverproc
)
846 ret
= whic
->driverproc(hic
, whic
->hdrv
, msg
, lParam1
, lParam2
);
850 ret
= SendDriverMessage(whic
->hdrv
, msg
, lParam1
, lParam2
);
853 FIXME("No 32=>16 conversion yet\n");
858 /**************************************************************************
859 * DllEntryPoint (MSVIDEO.300)
861 * MSVIDEO DLL entry point
864 BOOL WINAPI
VIDEO_LibMain(DWORD fdwReason
, HINSTANCE hinstDLL
, WORD ds
,
865 WORD wHeapSize
, DWORD dwReserved1
, WORD wReserved2
)
869 case DLL_PROCESS_ATTACH
:
870 /* hook in our 16 bit management functions */
871 pFnCallTo16
= IC_CallTo16
;
873 case DLL_PROCESS_DETACH
:
874 /* remove our 16 bit management functions */
877 case DLL_THREAD_ATTACH
:
878 case DLL_THREAD_DETACH
: