- many new Path* stubs
- many bugfixes
- class functions expanding environments variables now

diff --git a/dlls/shell32/classes.c b/dlls/shell32/classes.c
index 9390e91..5fb04c8 100644
--- a/dlls/shell32/classes.c
+++ b/dlls/shell32/classes.c
@@ -48,27 +48,31 @@
 	return TRUE;
 }
 BOOL HCR_GetExecuteCommand ( LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len )
-{	HKEY	hkey;
-	char	sTemp[256];
+{
+	HKEY	hkey;
+	char	sTemp[MAX_PATH];
+	DWORD	dwType;
+	BOOL	ret = FALSE;
 	
 	TRACE("%s %s\n",szClass, szVerb );
 
 	sprintf(sTemp, "%s\\shell\\%s\\command",szClass, szVerb);
 
-	if (RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
-	{ return FALSE;
+	if (!RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
+	{
+	  if (!RegQueryValueExA(hkey, NULL, 0, &dwType, szDest, &len))
+	  {
+	    if (dwType == REG_EXPAND_SZ)
+	    {
+	      ExpandEnvironmentStringsA(szDest, sTemp, MAX_PATH);
+	      strcpy(szDest, sTemp);
+	    }
+	    ret = TRUE;
+	  }
+	  RegCloseKey(hkey);
 	}
-
-	if (RegQueryValueA(hkey,NULL,szDest,&len))
-	{ RegCloseKey(hkey);
-	  return FALSE;
-	}	
-	RegCloseKey(hkey);
-
 	TRACE("-- %s\n", szDest );
-
-	return TRUE;
-
+	return ret;
 }
 /***************************************************************************************
 *	HCR_GetDefaultIcon	[internal]
@@ -76,34 +80,34 @@
 * Gets the icon for a filetype
 */
 BOOL HCR_GetDefaultIcon (LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr)
-{	HKEY	hkey;
-	char	sTemp[256];
+{
+	HKEY	hkey;
+	char	sTemp[MAX_PATH];
 	char	sNum[5];
+	DWORD	dwType;
+	BOOL	ret = FALSE;
 
 	TRACE("%s\n",szClass );
 
 	sprintf(sTemp, "%s\\DefaultIcon",szClass);
 
-	if (RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
-	{ return FALSE;
+	if (!RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
+	{
+	  if (!RegQueryValueExA(hkey, NULL, 0, &dwType, szDest, &len))
+	  {
+	    if (dwType == REG_EXPAND_SZ)
+	    {
+	      ExpandEnvironmentStringsA(szDest, sTemp, MAX_PATH);
+	      strcpy(szDest, sTemp);
+	    }
+	    if (ParseFieldA (szDest, 2, sNum, 5)) *dwNr=atoi(sNum);
+	    ParseFieldA (szDest, 1, szDest, len);
+	    ret = TRUE;
+	  }	
+	  RegCloseKey(hkey);
 	}
-
-	if (RegQueryValueA(hkey,NULL,szDest,&len))
-	{ RegCloseKey(hkey);
-	  return FALSE;
-	}	
-
-	RegCloseKey(hkey);
-
-	if (ParseFieldA (szDest, 2, sNum, 5))
-	{ *dwNr=atoi(sNum);
-	}
-	
-	ParseFieldA (szDest, 1, szDest, len);
-	
 	TRACE("-- %s %li\n", szDest, *dwNr );
-
-	return TRUE;
+	return ret;
 }
 
 /***************************************************************************************