<HTML><BODY>From: Denis Malikov <mdn40000@mail.ru><br>Date: Sat, 16 Jun 2018 16:35:45 +0700<br>Subject: [PATCH] comctl32/imagelist: fix ImageList_Read/Write.<br><br>Fixed acceptable version and pointer calculation for mixing image and mask bits.<br><br>Tested on ReactOS 0.4.10 with *.reg files extracted from XP/2003 key HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\TrayNotify<br><br>Signed-off-by: Denis Malikov <mdn40000@mail.ru><br>---<br> dlls/comctl32/imagelist.c | 48 +++++++++++++++++++++++------------------------<br> 1 file changed, 24 insertions(+), 24 deletions(-)<br><br>diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c<br>index a08d60752e..f0f8a695fe 100644<br>--- a/dlls/comctl32/imagelist.c<br>+++ b/dlls/comctl32/imagelist.c<br>@@ -2257,38 +2257,38 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)<br>     BITMAPINFO *image_info = (BITMAPINFO *)image_buf;<br>     BITMAPINFO *mask_info = (BITMAPINFO *)mask_buf;<br>     void *image_bits, *mask_bits = NULL;<br>-    ILHEAD    ilHead;<br>-    HIMAGELIST    himl;<br>+    ILHEAD ilHead;<br>+    HIMAGELIST himl;<br>     unsigned int i;<br> <br>     TRACE("%p\n", pstm);<br> <br>     if (FAILED(IStream_Read (pstm, &ilHead, sizeof(ILHEAD), NULL)))<br>-    return NULL;<br>+        return NULL;<br>     if (ilHead.usMagic != (('L' << 8) | 'I'))<br>-    return NULL;<br>-    if (ilHead.usVersion != 0x101) /* probably version? */<br>-    return NULL;<br>+        return NULL;<br>+    if (ilHead.usVersion != 0x600) /* XP/2003 version */<br>+        return NULL;<br> <br>     TRACE("cx %u, cy %u, flags 0x%04x, cCurImage %u, cMaxImage %u\n",<br>           ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);<br> <br>     himl = ImageList_Create(ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);<br>     if (!himl)<br>-    return NULL;<br>+        return NULL;<br> <br>     if (!(image_bits = read_bitmap(pstm, image_info)))<br>     {<br>-    WARN("failed to read bitmap from stream\n");<br>-    return NULL;<br>+        WARN("failed to read bitmap from stream\n");<br>+        return NULL;<br>     }<br>     if (ilHead.flags & ILC_MASK)<br>     {<br>         if (!(mask_bits = read_bitmap(pstm, mask_info)))<br>         {<br>             WARN("failed to read mask bitmap from stream\n");<br>-        return NULL;<br>-    }<br>+            return NULL;<br>+        }<br>     }<br>     else mask_info = NULL;<br> <br>@@ -2296,23 +2296,23 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)<br>     {<br>         DWORD *ptr = image_bits;<br>         BYTE *mask_ptr = mask_bits;<br>-        int stride = himl->cy * image_info->bmiHeader.biWidth;<br>+        int stride = himl->cy * himl->cx;<br> <br>         if (image_info->bmiHeader.biHeight > 0)  /* bottom-up */<br>         {<br>             ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride;<br>-            mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8;<br>+            mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 4;<br>             stride = -stride;<br>             image_info->bmiHeader.biHeight = himl->cy;<br>         }<br>         else image_info->bmiHeader.biHeight = -himl->cy;<br> <br>-        for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT)<br>+        for (i = 0; i < ilHead.cCurImage; i++)<br>         {<br>-            add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ),<br>+            add_dib_bits( himl, i, 1,<br>                           himl->cx, himl->cy, image_info, mask_info, ptr, mask_ptr );<br>             ptr += stride;<br>-            mask_ptr += stride / 8;<br>+            mask_ptr += stride / 4;<br>         }<br>     }<br>     else<br>@@ -2333,7 +2333,7 @@ HIMAGELIST WINAPI ImageList_Read(IStream *pstm)<br> <br>     ImageList_SetBkColor(himl,ilHead.bkcolor);<br>     for (i=0;i<4;i++)<br>-    ImageList_SetOverlayImage(himl,ilHead.ovls[i],i+1);<br>+        ImageList_SetOverlayImage(himl,ilHead.ovls[i],i+1);<br>     return himl;<br> }<br> <br>@@ -3078,10 +3078,10 @@ BOOL WINAPI ImageList_Write(HIMAGELIST himl, IStream *pstm)<br>     TRACE("%p %p\n", himl, pstm);<br> <br>     if (!is_valid(himl))<br>-    return FALSE;<br>+        return FALSE;<br> <br>     ilHead.usMagic   = (('L' << 8) | 'I');<br>-    ilHead.usVersion = 0x101;<br>+    ilHead.usVersion = 0x600;<br>     ilHead.cCurImage = himl->cCurImage;<br>     ilHead.cMaxImage = himl->cMaxImage;<br>     ilHead.cGrow     = himl->cGrow;<br>@@ -3090,23 +3090,23 @@ BOOL WINAPI ImageList_Write(HIMAGELIST himl, IStream *pstm)<br>     ilHead.bkcolor   = himl->clrBk;<br>     ilHead.flags     = himl->flags;<br>     for(i = 0; i < 4; i++) {<br>-    ilHead.ovls[i] = himl->nOvlIdx[i];<br>+        ilHead.ovls[i] = himl->nOvlIdx[i];<br>     }<br> <br>     TRACE("cx %u, cy %u, flags 0x04%x, cCurImage %u, cMaxImage %u\n",<br>           ilHead.cx, ilHead.cy, ilHead.flags, ilHead.cCurImage, ilHead.cMaxImage);<br> <br>     if(FAILED(IStream_Write(pstm, &ilHead, sizeof(ILHEAD), NULL)))<br>-    return FALSE;<br>+        return FALSE;<br> <br>     /* write the bitmap */<br>     if(!_write_bitmap(himl->hbmImage, pstm))<br>-    return FALSE;<br>+        return FALSE;<br> <br>     /* write the mask if we have one */<br>     if(himl->flags & ILC_MASK) {<br>-    if(!_write_bitmap(himl->hbmMask, pstm))<br>-        return FALSE;<br>+        if(!_write_bitmap(himl->hbmMask, pstm))<br>+            return FALSE;<br>     }<br> <br>     return TRUE;<br>-- <br>2.16.2.windows.1<br><br><br><br></BODY></HTML>