diff --git a/win32ss/user/user32/misc/exticon.c b/win32ss/user/user32/misc/exticon.c index ba2bd6d6b2c..c9781b44de0 100644 --- a/win32ss/user/user32/misc/exticon.c +++ b/win32ss/user/user32/misc/exticon.c @@ -447,14 +447,25 @@ static UINT ICO_ExtractIconExW( { HICON icon; WORD *cursorData = NULL; + BITMAPINFOHEADER bmih; imageData = peimage + dataOffset; entry = (LPICONIMAGE)(imageData); + memcpy(&bmih, imageData, sizeof(BITMAPINFOHEADER)); if(sig == 2) { + /* biSizeImage is the size of the raw bitmap data. + * A dummy 0 can be given for BI_RGB bitmaps. + * https://en.wikipedia.org/wiki/BMP_file_format */ + if ((bmih.biCompression == BI_RGB) && + (entry->icHeader.biSizeImage == 0)) + { + bmih.biSizeImage = bmih.biWidth * + bmih.biHeight / 2 * bmih.biBitCount / 8; + } /* we need to prepend the bitmap data with hot spots for CreateIconFromResourceEx */ - cursorData = HeapAlloc(GetProcessHeap(), 0, entry->icHeader.biSizeImage + 2 * sizeof(WORD)); + cursorData = HeapAlloc(GetProcessHeap(), 0, bmih.biSizeImage + 2 * sizeof(WORD)); if(!cursorData) continue; @@ -462,12 +473,12 @@ static UINT ICO_ExtractIconExW( cursorData[0] = hotSpot.x; cursorData[1] = hotSpot.y; - memcpy(cursorData + 2, imageData, entry->icHeader.biSizeImage); + memcpy(cursorData + 2, imageData, bmih.biSizeImage); imageData = (LPBYTE)cursorData; } - icon = CreateIconFromResourceEx(imageData, entry->icHeader.biSizeImage, sig == 1, 0x00030000, cx[index], cy[index], flags); + icon = CreateIconFromResourceEx(imageData, bmih.biSizeImage, sig == 1, 0x00030000, cx[index], cy[index], flags); HeapFree(GetProcessHeap(), 0, cursorData);