Author: khornicek
Date: Thu Nov  6 19:11:03 2014
New Revision: 65297

URL: http://svn.reactos.org/svn/reactos?rev=65297&view=rev
Log:
[USER32]
- add ICO files support for PrivateExtractIcons(Ex)
- fixes Juice and ICO files now show their icons in explorer
CORE-4021

Modified:
    trunk/reactos/win32ss/user/user32/misc/exticon.c

Modified: trunk/reactos/win32ss/user/user32/misc/exticon.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/misc/exticon.c?rev=65297&r1=65296&r2=65297&view=diff
==============================================================================
--- trunk/reactos/win32ss/user/user32/misc/exticon.c    [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/user32/misc/exticon.c    [iso-8859-1] Thu Nov  6 
19:11:03 2014
@@ -221,7 +221,7 @@
        LPBYTE          pData;
        DWORD           sig;
        HANDLE          hFile;
-       UINT16          iconDirCount = 0; //,iconCount = 0;
+       UINT16          iconDirCount = 0, iconCount = 0;
        LPBYTE          peimage;
        HANDLE          fmapping;
        DWORD           fsizeh,fsizel;
@@ -360,12 +360,48 @@
            }
          }
        }
+#else
+    if (sig == 1) /* .ICO file */
+    {
+        TRACE("-- icon Signature (0x%08x)\n", sig);
+
+        if (pData == (BYTE*)-1)
+        {
+            INT dataOffset;
+            LPICONIMAGE entry;
+            CURSORICONDIR *lpcid = (CURSORICONDIR*)peimage;
+            INT cx[2] = {cx1, cx2}, cy[2] = {cy1, cy2};
+            INT index;
+
+            if (lpcid->idType != 1)
+                return 0;
+
+            for(index = 0; index < 2; index++)
+            {
+                dataOffset = LookupIconIdFromDirectoryEx(peimage, TRUE, 
cx[index], cy[index], flags);
+
+                if (dataOffset)
+                {
+                    HICON icon;
+                    entry = (LPICONIMAGE)(peimage + dataOffset);
+                    icon = CreateIconFromResourceEx(peimage + dataOffset, 
entry->icHeader.biSizeImage, TRUE, 0x00030000, cx[index], cy[index], flags);
+
+                    if (icon)
+                    {
+                        RetPtr[index] = icon;
+                        iconCount = 1;
+                    }
+                }
+            }
+
+        }
+        ret = iconCount;       /* return number of retrieved icons */
+    }
+#endif
 /* end ico file */
 
 /* exe/dll */
        else if( sig == IMAGE_NT_SIGNATURE )
-#endif
-       if( sig == IMAGE_NT_SIGNATURE )
        {
         BYTE *idata, *igdata;
         const IMAGE_RESOURCE_DIRECTORY *rootresdir, *iconresdir, 
*icongroupresdir;


Reply via email to