Wine will crash when loading some codecs

Waldeck Schutzer schutzer at math.rutgers.edu
Sun Jan 19 22:44:24 CST 2003


Hi again,

I noticed that Wine will crash when loading some codecs that fail to 
fully initialize the structure ICINFO. According the docs, the drivers 
are not obliged to supply a value for szDriver in ICINFO. This causes 
some applications that rely on the value of this field to crash. After 
some short investigation, I realized that Windows seems to set szDriver 
equal to the driver's file name. The proposed correction to 
msvideo_main.c follows. Please notice that, because I made this patch 
with cvs diff -u, it also shows the corrections in, and therefore 
supersedes, the patch I sent you yesterday. I appologize for being too 
lazy to split it up.

Thank you and enjoy,
Waldeck

-------------- next part --------------
Index: wine/dlls/msvideo/msvideo_main.c
===================================================================
RCS file: /home/wine/wine/dlls/msvideo/msvideo_main.c,v
retrieving revision 1.45
diff -u -r1.45 msvideo_main.c
--- wine/dlls/msvideo/msvideo_main.c	14 Jan 2003 23:43:42 -0000	1.45
+++ wine/dlls/msvideo/msvideo_main.c	20 Jan 2003 04:35:07 -0000
@@ -29,6 +29,7 @@
 #include <string.h>
 
 #include "msvideo_private.h"
+#include "winnls.h"
 #include "wingdi.h"
 #include "winuser.h"
 
@@ -79,13 +80,16 @@
     char	buf[2000];
 
     TRACE("(%.4s,%.4s,%p)\n", (char*)&fccType, (char*)&fccHandler, lpicinfo);
+    // The "Case of the missing codecs"
+    // A fix proposed by Waldeck Schutzer <waldeck at dm.ufscar.br>
 
     if (GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini")) 
     {
         char *s = buf;
         while (*s) 
         {
-            if (!strncasecmp((char*)&fccType, s, 4) && s[4] == '.' && s[9] == '=')
+            if (!strncasecmp((char*)&fccType, s, 4) && s[4] == '.' /* && s[9] == '=' */ )
+            // buf is a list of keys, not keys followed by their values!
             {
                 if (!fccHandler--) 
                 {
@@ -95,11 +99,16 @@
                     hic = ICOpen(fccType, lpicinfo->fccHandler, ICMODE_QUERY);
                     if (hic)
                     {
+			// Some bad codecs can make wine crash right here.
+			// It would be nice to know why and to find ways
+			// to preventing it from happening. I can't do it.
                         ICGetInfo(hic, lpicinfo, lpicinfo->dwSize);
                         ICClose(hic);
                         return TRUE;
                     }
-                    return FALSE;
+                    // return FALSE;
+		    // This one failed to open, but keep going down the list!
+		    fccHandler++;
                 }
             }
             s += strlen(s) + 1; /* either next char or \0 */
@@ -251,9 +260,29 @@
  */
 LRESULT VFWAPI ICGetInfo(HIC hic,ICINFO *picinfo,DWORD cb) {
 	LRESULT		ret;
+	char    codecname[10];
+	char	szDriver[128];
 
 	TRACE("(%p,%p,%ld)\n",hic,picinfo,cb);
+
+	// The field szDriver should be initialized because the driver is
+	// not obliged and often do not do so! I have seen crashes due to
+	// this field going unitialized.
+	if (picinfo && cb >= sizeof(ICINFO)) 
+	   szDriver[0] = 0; // At first, set it to an empty string
+
 	ret = ICSendMessage(hic,ICM_GETINFO,(DWORD)picinfo,cb);
+
+	// If szDriver is not supplied by the driver itself, it seems that
+	// Windows sets its value equal to the driver file name. That can
+	// be obtained from the registry as we do here.
+	if (picinfo && cb >= sizeof(ICINFO))
+	   if (szDriver[0] == 0) { // szDriver not supplied?
+              sprintf(codecname, "vidc.%.4s", (char*)&(picinfo->fccHandler));
+              GetPrivateProfileStringA("drivers32", codecname, "", szDriver, sizeof(szDriver), "system.ini");
+	      MultiByteToWideChar(CP_ACP, 0, szDriver, -1, picinfo->szDriver, sizeof(picinfo->szDriver)/sizeof(WCHAR));
+	   }
+
 	TRACE("	-> 0x%08lx\n",ret);
 	return ret;
 }


More information about the wine-patches mailing list