ReactOS 0.4.15-dev-6663-gd1e9fe1
exticon.c File Reference
#include <user32.h>
#include <pshpack1.h>
#include <poppack.h>
Include dependency graph for exticon.c:

Go to the source code of this file.

Classes

struct  icoICONDIRENTRY
 
struct  icoICONDIR
 
struct  NE_NAMEINFO
 
struct  NE_TYPEINFO
 

Macros

#define ARRAY_SIZE(x)   (sizeof(x) / sizeof((x)[0]))
 
#define NE_RSCTYPE_ICON   0x8003
 
#define NE_RSCTYPE_GROUP_ICON   0x800e
 

Typedefs

typedef struct icoICONDIRENTRYLPicoICONDIRENTRY
 
typedef struct icoICONDIRLPicoICONDIR
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (icon)
 
DWORD get_best_icon_file_offset (const LPBYTE dir, DWORD dwFileSize, int cxDesired, int cyDesired, BOOL bIcon, DWORD fuLoad, POINT *ptHotSpot)
 
static const IMAGE_RESOURCE_DIRECTORYfind_entry_by_id (const IMAGE_RESOURCE_DIRECTORY *dir, WORD id, const void *root)
 
static const IMAGE_RESOURCE_DIRECTORYfind_entry_default (const IMAGE_RESOURCE_DIRECTORY *dir, const void *root)
 
static DWORD USER32_GetResourceTable (LPBYTE peimage, DWORD pesize, LPBYTE *retptr)
 
static BYTEUSER32_LoadResource (LPBYTE peimage, NE_NAMEINFO *pNInfo, WORD sizeShift, ULONG *uSize)
 
static BYTEICO_LoadIcon (LPBYTE peimage, LPicoICONDIRENTRY lpiIDE, ULONG *uSize)
 
static BYTEICO_GetIconDirectory (LPBYTE peimage, LPicoICONDIR *lplpiID, ULONG *uSize)
 
static UINT ICO_ExtractIconExW (LPCWSTR lpszExeFileName, HICON *RetPtr, INT nIconIndex, UINT nIcons, UINT cxDesired, UINT cyDesired, UINT *pIconId, UINT flags)
 
UINT WINAPI PrivateExtractIconsW (LPCWSTR lpwstrFile, int nIndex, int sizeX, int sizeY, HICON *phicon, UINT *pIconId, UINT nIcons, UINT flags)
 
UINT WINAPI PrivateExtractIconsA (LPCSTR lpstrFile, int nIndex, int sizeX, int sizeY, HICON *phicon, UINT *piconid, UINT nIcons, UINT flags)
 
UINT WINAPI PrivateExtractIconExW (LPCWSTR lpwstrFile, int nIndex, HICON *phIconLarge, HICON *phIconSmall, UINT nIcons)
 
UINT WINAPI PrivateExtractIconExA (LPCSTR lpstrFile, int nIndex, HICON *phIconLarge, HICON *phIconSmall, UINT nIcons)
 

Macro Definition Documentation

◆ ARRAY_SIZE

#define ARRAY_SIZE (   x)    (sizeof(x) / sizeof((x)[0]))

Definition at line 28 of file exticon.c.

◆ NE_RSCTYPE_GROUP_ICON

#define NE_RSCTYPE_GROUP_ICON   0x800e

Definition at line 92 of file exticon.c.

◆ NE_RSCTYPE_ICON

#define NE_RSCTYPE_ICON   0x8003

Definition at line 91 of file exticon.c.

Typedef Documentation

◆ LPicoICONDIR

◆ LPicoICONDIRENTRY

Function Documentation

◆ find_entry_by_id()

static const IMAGE_RESOURCE_DIRECTORY * find_entry_by_id ( const IMAGE_RESOURCE_DIRECTORY dir,
WORD  id,
const void root 
)
static

Definition at line 126 of file exticon.c.

128{
130 int min, max, pos;
131
133 min = dir->NumberOfNamedEntries;
134 max = min + dir->NumberOfIdEntries - 1;
135 while (min <= max)
136 {
137 pos = (min + max) / 2;
138 if (entry[pos].Id == id)
139 return (const IMAGE_RESOURCE_DIRECTORY *)((const char *)root + entry[pos].OffsetToDirectory);
140 if (entry[pos].Id > id) max = pos - 1;
141 else min = pos + 1;
142 }
143 return NULL;
144}
DWORD Id
unsigned int dir
Definition: maze.c:112
#define NULL
Definition: types.h:112
uint32_t entry
Definition: isohybrid.c:63
#define min(a, b)
Definition: monoChain.cc:55
Definition: pedump.c:414
#define max(a, b)
Definition: svc.c:63

Referenced by ICO_ExtractIconExW().

◆ find_entry_default()

static const IMAGE_RESOURCE_DIRECTORY * find_entry_default ( const IMAGE_RESOURCE_DIRECTORY dir,
const void root 
)
static

Definition at line 152 of file exticon.c.

154{
157 return (const IMAGE_RESOURCE_DIRECTORY *)((const char *)root + entry->OffsetToDirectory);
158}

Referenced by ICO_ExtractIconExW().

◆ get_best_icon_file_offset()

DWORD get_best_icon_file_offset ( const LPBYTE  dir,
DWORD  dwFileSize,
int  cxDesired,
int  cyDesired,
BOOL  bIcon,
DWORD  fuLoad,
POINT ptHotSpot 
)

Referenced by ICO_ExtractIconExW().

◆ ICO_ExtractIconExW()

static UINT ICO_ExtractIconExW ( LPCWSTR  lpszExeFileName,
HICON RetPtr,
INT  nIconIndex,
UINT  nIcons,
UINT  cxDesired,
UINT  cyDesired,
UINT pIconId,
UINT  flags 
)
static

Definition at line 280 of file exticon.c.

301{
302 UINT ret = 0;
303 UINT cx1, cx2, cy1, cy2;
305 DWORD sig;
307 UINT16 iconDirCount = 0,iconCount = 0;
308 LPBYTE peimage;
309 HANDLE fmapping;
310 DWORD fsizeh,fsizel;
311#ifdef __REACTOS__
312 WCHAR szExpandedExePath[MAX_PATH];
313#endif
314 WCHAR szExePath[MAX_PATH];
315 DWORD dwSearchReturn;
316
317#ifdef __REACTOS__
318 TRACE("%s, %d, %d, %p, 0x%08x, %d\n", debugstr_w(lpszExeFileName), nIconIndex, nIcons, pIconId, flags, fIconEx);
319#else
320 TRACE("%s, %d, %d %p 0x%08x\n", debugstr_w(lpszExeFileName), nIconIndex, nIcons, pIconId, flags);
321#endif
322
323#ifdef __REACTOS__
324 if (RetPtr)
325 *RetPtr = NULL;
326
327 if (ExpandEnvironmentStringsW(lpszExeFileName, szExpandedExePath, ARRAY_SIZE(szExpandedExePath)))
328 lpszExeFileName = szExpandedExePath;
329#endif
330
331 dwSearchReturn = SearchPathW(NULL, lpszExeFileName, NULL, ARRAY_SIZE(szExePath), szExePath, NULL);
332 if ((dwSearchReturn == 0) || (dwSearchReturn > ARRAY_SIZE(szExePath)))
333 {
334#ifdef __REACTOS__
335 WARN("File %s not found or path too long and fIconEx is '%d'\n",
336 debugstr_w(lpszExeFileName), fIconEx);
337 if (fIconEx && !RetPtr && !pIconId)
338 return 0;
339 else
340 return -1;
341#else
342 WARN("File %s not found or path too long\n", debugstr_w(lpszExeFileName));
343 return -1;
344#endif
345 }
346
348 if (hFile == INVALID_HANDLE_VALUE) return ret;
349 fsizel = GetFileSize(hFile,&fsizeh);
350
351 /* Map the file */
354 if (!fmapping)
355 {
356 WARN("CreateFileMapping error %ld\n", GetLastError() );
357 return 0xFFFFFFFF;
358 }
359
360 if (!(peimage = MapViewOfFile(fmapping, FILE_MAP_READ, 0, 0, 0)))
361 {
362 WARN("MapViewOfFile error %ld\n", GetLastError() );
363 CloseHandle(fmapping);
364 return 0xFFFFFFFF;
365 }
366 CloseHandle(fmapping);
367
368#ifdef __REACTOS__
369 /* Check if we have a min size of 2 headers RIFF & 'icon'
370 * at 8 chars each plus an anih header of 36 byptes.
371 * Also, is this resource an animjated icon/cursor (RIFF) */
372 if ((fsizel >= 52) && !memcmp(peimage, "RIFF", 4))
373 {
374 UINT anihOffset;
375 UINT anihMax;
376 /* Get size of the animation data */
377 ULONG uSize = MAKEWORD(peimage[4], peimage[5]);
378
379 /* Check if uSize is reasonable with respect to fsizel */
380 if ((uSize < strlen("anih")) || (uSize > fsizel))
381 goto end;
382
383 /* Look though the reported size less search string length */
384 anihMax = uSize - strlen("anih");
385 /* Search for 'anih' indicating animation header */
386 for (anihOffset = 0; anihOffset < anihMax; anihOffset++)
387 {
388 if (memcmp(&peimage[anihOffset], "anih", 4) == 0)
389 break;
390 }
391
392 if (anihOffset + sizeof(aniheader) > fsizel)
393 goto end;
394
395 /* Get count of images for return value */
396 ret = MAKEWORD(peimage[anihOffset + 12], peimage[anihOffset + 13]);
397
398 TRACE("RIFF File with '%u' images at Offset '%u'.\n", ret, anihOffset);
399
400 cx1 = LOWORD(cxDesired);
401 cy1 = LOWORD(cyDesired);
402
403 if (RetPtr)
404 {
405 RetPtr[0] = CreateIconFromResourceEx(peimage, uSize, TRUE, 0x00030000, cx1, cy1, flags);
406 }
407 goto end;
408 }
409#endif
410
411 cx1 = LOWORD(cxDesired);
412 cx2 = HIWORD(cxDesired);
413 cy1 = LOWORD(cyDesired);
414 cy2 = HIWORD(cyDesired);
415
416 if (pIconId) /* Invalidate first icon identifier */
417 *pIconId = 0xFFFFFFFF;
418
419 if (!pIconId) /* if no icon identifier array present use the icon handle array as intermediate storage */
420 pIconId = (UINT*)RetPtr;
421
422 sig = USER32_GetResourceTable(peimage, fsizel, &pData);
423
424/* NE exe/dll */
425 if (sig==IMAGE_OS2_SIGNATURE)
426 {
427 BYTE *pCIDir = 0;
428 NE_TYPEINFO *pTInfo = (NE_TYPEINFO*)(pData + 2);
429 NE_NAMEINFO *pIconStorage = NULL;
430 NE_NAMEINFO *pIconDir = NULL;
431 LPicoICONDIR lpiID = NULL;
432 ULONG uSize = 0;
433
434 TRACE("-- OS2/icon Signature (0x%08x)\n", sig);
435
436 if (pData == (BYTE*)-1)
437 {
438 pCIDir = ICO_GetIconDirectory(peimage, &lpiID, &uSize); /* check for .ICO file */
439 if (pCIDir)
440 {
441 iconDirCount = 1; iconCount = lpiID->idCount;
442 TRACE("-- icon found %p 0x%08x 0x%08x 0x%08x\n", pCIDir, uSize, iconDirCount, iconCount);
443 }
444 }
445 else while (pTInfo->type_id && !(pIconStorage && pIconDir))
446 {
447 if (pTInfo->type_id == NE_RSCTYPE_GROUP_ICON) /* find icon directory and icon repository */
448 {
449 iconDirCount = pTInfo->count;
450 pIconDir = ((NE_NAMEINFO*)(pTInfo + 1));
451 TRACE("\tfound directory - %i icon families\n", iconDirCount);
452 }
453 if (pTInfo->type_id == NE_RSCTYPE_ICON)
454 {
455 iconCount = pTInfo->count;
456 pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1));
457 TRACE("\ttotal icons - %i\n", iconCount);
458 }
459 pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO));
460 }
461
462 if ((pIconStorage && pIconDir) || lpiID) /* load resources and create icons */
463 {
464 if (nIcons == 0)
465 {
466 ret = iconDirCount;
467 if (lpiID) /* *.ico file, deallocate heap pointer*/
468 HeapFree(GetProcessHeap(), 0, pCIDir);
469 }
470 else if (nIconIndex < iconDirCount)
471 {
472 UINT16 i, icon;
473 if (nIcons > iconDirCount - nIconIndex)
474 nIcons = iconDirCount - nIconIndex;
475
476 for (i = 0; i < nIcons; i++)
477 {
478 /* .ICO files have only one icon directory */
479 if (lpiID == NULL) /* not *.ico */
480 pCIDir = USER32_LoadResource(peimage, pIconDir + i + nIconIndex, *(WORD*)pData, &uSize);
481 pIconId[i] = LookupIconIdFromDirectoryEx(pCIDir, TRUE, cx1, cy1, flags);
482 if (cx2 && cy2) pIconId[++i] = LookupIconIdFromDirectoryEx(pCIDir, TRUE, cx2, cy2, flags);
483 }
484 if (lpiID) /* *.ico file, deallocate heap pointer*/
485 HeapFree(GetProcessHeap(), 0, pCIDir);
486
487 for (icon = 0; icon < nIcons; icon++)
488 {
489 pCIDir = NULL;
490 if (lpiID)
491 pCIDir = ICO_LoadIcon(peimage, lpiID->idEntries + (int)pIconId[icon], &uSize);
492 else
493 for (i = 0; i < iconCount; i++)
494 if (pIconStorage[i].id == ((int)pIconId[icon] | 0x8000) )
495 pCIDir = USER32_LoadResource(peimage, pIconStorage + i, *(WORD*)pData, &uSize);
496
497 if (pCIDir)
498 {
499 RetPtr[icon] = CreateIconFromResourceEx(pCIDir, uSize, TRUE, 0x00030000,
500 cx1, cy1, flags);
501 if (cx2 && cy2)
502 RetPtr[++icon] = CreateIconFromResourceEx(pCIDir, uSize, TRUE, 0x00030000,
503 cx2, cy2, flags);
504 }
505 else
506 RetPtr[icon] = 0;
507 }
508 ret = icon; /* return number of retrieved icons */
509 }
510 }
511 }
512 else
513 if (sig == 1 || sig == 2) /* .ICO or .CUR file */
514 {
515 TRACE("-- icon Signature (0x%08x)\n", sig);
516
517 if (pData == (BYTE*)-1)
518 {
519 INT cx[2] = {cx1, cx2}, cy[2] = {cy1, cy2};
520 INT index;
521
522 for(index = 0; index < (cx2 || cy2 ? 2 : 1); index++)
523 {
524 DWORD dataOffset;
525 LPBYTE imageData;
526 POINT hotSpot;
527#ifndef __REACTOS__
529#endif
530
531 dataOffset = get_best_icon_file_offset(peimage, fsizel, cx[index], cy[index], sig == 1, flags, sig == 1 ? NULL : &hotSpot);
532
533 if (dataOffset)
534 {
535 HICON icon;
536 WORD *cursorData = NULL;
537#ifdef __REACTOS__
539 DWORD cbColorTable = 0, cbTotal;
540#endif
541
542 imageData = peimage + dataOffset;
543#ifdef __REACTOS__
544 /* Calculate the size of color table */
545 ZeroMemory(&bi, sizeof(bi));
546 CopyMemory(&bi, imageData, sizeof(BITMAPCOREHEADER));
547 if (bi.biBitCount <= 8)
548 {
549 if (bi.biSize >= sizeof(BITMAPINFOHEADER))
550 {
551 CopyMemory(&bi, imageData, sizeof(BITMAPINFOHEADER));
552 if (bi.biClrUsed)
553 cbColorTable = bi.biClrUsed * sizeof(RGBQUAD);
554 else
555 cbColorTable = (1 << bi.biBitCount) * sizeof(RGBQUAD);
556 }
557 else if (bi.biSize == sizeof(BITMAPCOREHEADER))
558 {
559 cbColorTable = (1 << bi.biBitCount) * sizeof(RGBTRIPLE);
560 }
561 }
562
563 /* biSizeImage is the size of the raw bitmap data.
564 * https://en.wikipedia.org/wiki/BMP_file_format */
565 if (bi.biSizeImage == 0)
566 {
567 /* Calculate image size */
568#define WIDTHBYTES(width, bits) (((width) * (bits) + 31) / 32 * 4)
569 bi.biSizeImage = WIDTHBYTES(bi.biWidth, bi.biBitCount) * (bi.biHeight / 2);
570 bi.biSizeImage += WIDTHBYTES(bi.biWidth, 1) * (bi.biHeight / 2);
571#undef WIDTHBYTES
572 }
573
574 /* Calculate total size */
575 cbTotal = bi.biSize + cbColorTable + bi.biSizeImage;
576#else
577 entry = (LPICONIMAGE)(imageData);
578#endif
579
580 if(sig == 2)
581 {
582 /* we need to prepend the bitmap data with hot spots for CreateIconFromResourceEx */
583#ifdef __REACTOS__
584 cursorData = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(WORD) + cbTotal);
585#else
586 cursorData = HeapAlloc(GetProcessHeap(), 0, entry->icHeader.biSizeImage + 2 * sizeof(WORD));
587#endif
588
589 if(!cursorData)
590 continue;
591
592 cursorData[0] = hotSpot.x;
593 cursorData[1] = hotSpot.y;
594
595#ifdef __REACTOS__
596 CopyMemory(cursorData + 2, imageData, cbTotal);
597#else
598 memcpy(cursorData + 2, imageData, entry->icHeader.biSizeImage);
599#endif
600
601 imageData = (LPBYTE)cursorData;
602 }
603
604#ifdef __REACTOS__
605 icon = CreateIconFromResourceEx(imageData, cbTotal, sig == 1, 0x00030000, cx[index], cy[index], flags);
606 if (fIconEx && sig == 1)
607 iconCount = 1;
608#else
609 icon = CreateIconFromResourceEx(imageData, entry->icHeader.biSizeImage, sig == 1, 0x00030000, cx[index], cy[index], flags);
610#endif
611
612 HeapFree(GetProcessHeap(), 0, cursorData);
613
614 if (icon)
615 {
616 if (RetPtr)
617 RetPtr[index] = icon;
618 else
619 DestroyIcon(icon);
620
621 iconCount = 1;
622 break;
623 }
624 }
625 }
626 }
627 ret = iconCount; /* return number of retrieved icons */
628 }
629/* end ico file */
630
631/* exe/dll */
632 else if( sig == IMAGE_NT_SIGNATURE )
633 {
634 BYTE *idata, *igdata;
635 const IMAGE_RESOURCE_DIRECTORY *rootresdir, *iconresdir, *icongroupresdir;
636 const IMAGE_RESOURCE_DATA_ENTRY *idataent, *igdataent;
637 const IMAGE_RESOURCE_DIRECTORY_ENTRY *xresent;
638 ULONG size;
639 UINT i;
640
642 if (!rootresdir)
643 {
644 WARN("haven't found section for resource directory.\n");
645 goto end;
646 }
647
648#ifdef __REACTOS__
649 /* Check for boundary limit (and overflow) */
650 if (((ULONG_PTR)(rootresdir + 1) < (ULONG_PTR)rootresdir) ||
651 ((ULONG_PTR)(rootresdir + 1) > (ULONG_PTR)peimage + fsizel))
652 {
653 goto end;
654 }
655#endif
656
657 /* search for the group icon directory */
658 if (!(icongroupresdir = find_entry_by_id(rootresdir, LOWORD(RT_GROUP_ICON), rootresdir)))
659 {
660 WARN("No Icongroupresourcedirectory!\n");
661 goto end; /* failure */
662 }
663 iconDirCount = icongroupresdir->NumberOfNamedEntries + icongroupresdir->NumberOfIdEntries;
664
665 /* only number of icons requested */
666 if( !pIconId )
667 {
668 ret = iconDirCount;
669 goto end; /* success */
670 }
671
672 if( nIconIndex < 0 )
673 {
674 /* search resource id */
675 int n = 0;
676 int iId = abs(nIconIndex);
677 const IMAGE_RESOURCE_DIRECTORY_ENTRY* xprdeTmp = (const IMAGE_RESOURCE_DIRECTORY_ENTRY*)(icongroupresdir+1);
678
679 while(n<iconDirCount && xprdeTmp)
680 {
681 if(xprdeTmp->Id == iId)
682 {
683 nIconIndex = n;
684 break;
685 }
686 n++;
687 xprdeTmp++;
688 }
689 if (nIconIndex < 0)
690 {
691 WARN("resource id %d not found\n", iId);
692 goto end; /* failure */
693 }
694 }
695 else
696 {
697 /* check nIconIndex to be in range */
698 if (nIconIndex >= iconDirCount)
699 {
700 WARN("nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount);
701 goto end; /* failure */
702 }
703 }
704
705 /* assure we don't get too much */
706 if( nIcons > iconDirCount - nIconIndex )
707 nIcons = iconDirCount - nIconIndex;
708
709 /* starting from specified index */
710 xresent = (const IMAGE_RESOURCE_DIRECTORY_ENTRY*)(icongroupresdir+1) + nIconIndex;
711
712 for (i=0; i < nIcons; i++,xresent++)
713 {
714 const IMAGE_RESOURCE_DIRECTORY *resdir;
715
716 /* go down this resource entry, name */
717 resdir = (const IMAGE_RESOURCE_DIRECTORY *)((const char *)rootresdir + xresent->OffsetToDirectory);
718
719 /* default language (0) */
720 resdir = find_entry_default(resdir,rootresdir);
721 igdataent = (const IMAGE_RESOURCE_DATA_ENTRY*)resdir;
722
723 /* lookup address in mapped image for virtual address */
724 igdata = RtlImageRvaToVa(RtlImageNtHeader((HMODULE)peimage), (HMODULE)peimage, igdataent->OffsetToData, NULL);
725 if (!igdata)
726 {
727 FIXME("no matching real address for icongroup!\n");
728 goto end; /* failure */
729 }
730 pIconId[i] = LookupIconIdFromDirectoryEx(igdata, TRUE, cx1, cy1, flags);
731 if (cx2 && cy2) pIconId[++i] = LookupIconIdFromDirectoryEx(igdata, TRUE, cx2, cy2, flags);
732 }
733
734 if (!(iconresdir=find_entry_by_id(rootresdir,LOWORD(RT_ICON),rootresdir)))
735 {
736 WARN("No Iconresourcedirectory!\n");
737 goto end; /* failure */
738 }
739
740 for (i=0; i<nIcons; i++)
741 {
742 const IMAGE_RESOURCE_DIRECTORY *xresdir;
743 xresdir = find_entry_by_id(iconresdir, LOWORD(pIconId[i]), rootresdir);
744 if( !xresdir )
745 {
746 WARN("icon entry %d not found\n", LOWORD(pIconId[i]));
747 RetPtr[i]=0;
748 continue;
749 }
750 xresdir = find_entry_default(xresdir, rootresdir);
751 idataent = (const IMAGE_RESOURCE_DATA_ENTRY*)xresdir;
752
753 idata = RtlImageRvaToVa(RtlImageNtHeader((HMODULE)peimage), (HMODULE)peimage, idataent->OffsetToData, NULL);
754 if (!idata)
755 {
756 WARN("no matching real address found for icondata!\n");
757 RetPtr[i]=0;
758 continue;
759 }
760 RetPtr[i] = CreateIconFromResourceEx(idata, idataent->Size, TRUE, 0x00030000, cx1, cy1, flags);
761 if (cx2 && cy2)
762 RetPtr[++i] = CreateIconFromResourceEx(idata, idataent->Size, TRUE, 0x00030000, cx2, cy2, flags);
763 }
764 ret = i; /* return number of retrieved icons */
765 } /* if(sig == IMAGE_NT_SIGNATURE) */
766
767end:
768 UnmapViewOfFile(peimage); /* success */
769 return ret;
770}
unsigned short UINT16
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define index(s, c)
Definition: various.h:29
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define WIDTHBYTES(i)
Definition: dib.cpp:16
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define RtlImageDirectoryEntryToData
Definition: compat.h:809
#define GENERIC_READ
Definition: compat.h:135
#define RtlImageRvaToVa
Definition: compat.h:807
#define RtlImageNtHeader
Definition: compat.h:806
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define FILE_MAP_READ
Definition: compat.h:776
#define MapViewOfFile
Definition: compat.h:745
#define FILE_SHARE_READ
Definition: compat.h:136
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
DWORD WINAPI SearchPathW(IN LPCWSTR lpPath OPTIONAL, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart OPTIONAL)
Definition: path.c:1298
ULONG RGBQUAD
Definition: precomp.h:50
static const IMAGE_RESOURCE_DIRECTORY * find_entry_default(const IMAGE_RESOURCE_DIRECTORY *dir, const void *root)
Definition: exticon.c:152
#define ARRAY_SIZE(x)
Definition: exticon.c:28
static BYTE * USER32_LoadResource(LPBYTE peimage, NE_NAMEINFO *pNInfo, WORD sizeShift, ULONG *uSize)
Definition: exticon.c:210
static BYTE * ICO_GetIconDirectory(LPBYTE peimage, LPicoICONDIR *lplpiID, ULONG *uSize)
Definition: exticon.c:234
#define NE_RSCTYPE_ICON
Definition: exticon.c:91
static DWORD USER32_GetResourceTable(LPBYTE peimage, DWORD pesize, LPBYTE *retptr)
Definition: exticon.c:163
DWORD get_best_icon_file_offset(const LPBYTE dir, DWORD dwFileSize, int cxDesired, int cyDesired, BOOL bIcon, DWORD fuLoad, POINT *ptHotSpot)
static const IMAGE_RESOURCE_DIRECTORY * find_entry_by_id(const IMAGE_RESOURCE_DIRECTORY *dir, WORD id, const void *root)
Definition: exticon.c:126
#define NE_RSCTYPE_GROUP_ICON
Definition: exticon.c:92
static BYTE * ICO_LoadIcon(LPBYTE peimage, LPicoICONDIRENTRY lpiIDE, ULONG *uSize)
Definition: exticon.c:221
#define abs(i)
Definition: fconv.c:206
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
GLuint GLuint end
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
GLdouble n
Definition: glext.h:7729
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define debugstr_w
Definition: kernel32.h:32
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HICON
Definition: imagelist.c:84
_In_ HANDLE hFile
Definition: mswsock.h:90
unsigned int UINT
Definition: ndis.h:50
#define SEC_COMMIT
Definition: mmtypes.h:100
struct _ICONIMAGE * LPICONIMAGE
#define LOWORD(l)
Definition: pedump.c:82
#define IMAGE_NT_SIGNATURE
Definition: pedump.c:93
#define RT_ICON
Definition: pedump.c:365
#define IMAGE_OS2_SIGNATURE
Definition: pedump.c:90
#define RT_GROUP_ICON
Definition: pedump.c:375
#define IMAGE_DIRECTORY_ENTRY_RESOURCE
Definition: pedump.c:261
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
#define TRACE(s)
Definition: solgame.cpp:4
DWORD biSizeImage
Definition: amvideo.idl:36
WORD type_id
Definition: typelib.c:91
WORD count
Definition: typelib.c:92
Definition: pedump.c:458
DWORD OffsetToData
Definition: pedump.c:459
DWORD Size
Definition: pedump.c:460
ULONG OffsetToDirectory
Definition: ntimage.h:194
USHORT Id
Definition: ntimage.h:189
WORD idCount
Definition: exticon.c:53
icoICONDIRENTRY idEntries[1]
Definition: exticon.c:54
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
#define MAKEWORD(a, b)
Definition: typedefs.h:248
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
int ret
#define ZeroMemory
Definition: winbase.h:1700
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CopyMemory
Definition: winbase.h:1698
HICON WINAPI CreateIconFromResourceEx(_In_reads_bytes_(dwResSize) PBYTE presbits, _In_ DWORD dwResSize, _In_ BOOL fIcon, _In_ DWORD dwVer, _In_ int cxDesired, _In_ int cyDesired, _In_ UINT Flags)
int WINAPI LookupIconIdFromDirectoryEx(_In_reads_bytes_(sizeof(NEWHEADER)) PBYTE, _In_ BOOL, _In_ int, _In_ int, _In_ UINT)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193

Referenced by PrivateExtractIconExW(), and PrivateExtractIconsW().

◆ ICO_GetIconDirectory()

static BYTE * ICO_GetIconDirectory ( LPBYTE  peimage,
LPicoICONDIR lplpiID,
ULONG uSize 
)
static

Definition at line 234 of file exticon.c.

235{
236 CURSORICONDIR * lpcid; /* icon resource in resource-dir format */
237 CURSORICONDIR * lpID; /* icon resource in resource format */
238 int i;
239
240 TRACE("%p %p\n", peimage, lplpiID);
241
242 lpcid = (CURSORICONDIR*)peimage;
243
244 if( lpcid->idReserved || (lpcid->idType != 1) || (!lpcid->idCount) )
245 return 0;
246
247 /* allocate the phony ICONDIR structure */
248 *uSize = FIELD_OFFSET(CURSORICONDIR, idEntries[lpcid->idCount]);
249 if( (lpID = HeapAlloc(GetProcessHeap(),0, *uSize) ))
250 {
251 /* copy the header */
252 lpID->idReserved = lpcid->idReserved;
253 lpID->idType = lpcid->idType;
254 lpID->idCount = lpcid->idCount;
255
256 /* copy the entries */
257 for( i=0; i < lpcid->idCount; i++ )
258 {
259 memcpy(&lpID->idEntries[i], &lpcid->idEntries[i], sizeof(CURSORICONDIRENTRY) - 2);
260 lpID->idEntries[i].wResId = i;
261 }
262
263 *lplpiID = (LPicoICONDIR)peimage;
264 return (BYTE *)lpID;
265 }
266 return 0;
267}
struct icoICONDIR * LPicoICONDIR
WORD idReserved
Definition: ntusrtyp.h:99
CURSORICONDIRENTRY idEntries[1]
Definition: ntusrtyp.h:102
WORD idCount
Definition: ntusrtyp.h:101
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255

Referenced by ICO_ExtractIconExW().

◆ ICO_LoadIcon()

static BYTE * ICO_LoadIcon ( LPBYTE  peimage,
LPicoICONDIRENTRY  lpiIDE,
ULONG uSize 
)
static

Definition at line 221 of file exticon.c.

222{
223 TRACE("%p %p\n", peimage, lpiIDE);
224
225 *uSize = lpiIDE->dwBytesInRes;
226 return peimage + lpiIDE->dwImageOffset;
227}
DWORD dwImageOffset
Definition: exticon.c:46
DWORD dwBytesInRes
Definition: exticon.c:45

Referenced by ICO_ExtractIconExW().

◆ PrivateExtractIconExA()

UINT WINAPI PrivateExtractIconExA ( LPCSTR  lpstrFile,
int  nIndex,
HICON phIconLarge,
HICON phIconSmall,
UINT  nIcons 
)

Definition at line 925 of file exticon.c.

931{
932 UINT ret;
933 INT len = MultiByteToWideChar(CP_ACP, 0, lpstrFile, -1, NULL, 0);
934 LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
935#ifdef __REACTOS__
936 if (lpwstrFile == NULL)
937 return 0;
938#endif
939
940 TRACE("%s %d %p %p %d\n", lpstrFile, nIndex, phIconLarge, phIconSmall, nIcons);
941
942 MultiByteToWideChar(CP_ACP, 0, lpstrFile, -1, lpwstrFile, len);
943 ret = PrivateExtractIconExW(lpwstrFile, nIndex, phIconLarge, phIconSmall, nIcons);
944 HeapFree(GetProcessHeap(), 0, lpwstrFile);
945 return ret;
946}
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
UINT WINAPI PrivateExtractIconExW(LPCWSTR lpwstrFile, int nIndex, HICON *phIconLarge, HICON *phIconSmall, UINT nIcons)
Definition: exticon.c:847
GLenum GLsizei len
Definition: glext.h:6722
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ PrivateExtractIconExW()

UINT WINAPI PrivateExtractIconExW ( LPCWSTR  lpwstrFile,
int  nIndex,
HICON phIconLarge,
HICON phIconSmall,
UINT  nIcons 
)

Definition at line 847 of file exticon.c.

853{
854 DWORD cyicon, cysmicon, cxicon, cxsmicon;
855 UINT ret = 0;
856
857 TRACE("%s %d %p %p %d\n",
858 debugstr_w(lpwstrFile),nIndex,phIconLarge, phIconSmall, nIcons);
859
860#ifdef __REACTOS__
861 if (nIndex == -1 || (!phIconSmall && !phIconLarge))
862 /* get the number of icons */
863 return ICO_ExtractIconExW(lpwstrFile, NULL, 0, 0, 0, 0, NULL,
865#else
866 if (nIndex == -1)
867 /* get the number of icons */
868 return ICO_ExtractIconExW(lpwstrFile, NULL, 0, 0, 0, 0, NULL, LR_DEFAULTCOLOR);
869#endif
870
871 if (nIcons == 1 && phIconSmall && phIconLarge)
872 {
873 HICON hIcon[2];
874 cxicon = GetSystemMetrics(SM_CXICON);
875 cyicon = GetSystemMetrics(SM_CYICON);
876 cxsmicon = GetSystemMetrics(SM_CXSMICON);
877 cysmicon = GetSystemMetrics(SM_CYSMICON);
878
879#ifdef __REACTOS__
880 ret = ICO_ExtractIconExW(lpwstrFile, hIcon, nIndex, 2,
881 cxicon | (cxsmicon<<16),
882 cyicon | (cysmicon<<16), NULL,
884#else
885 ret = ICO_ExtractIconExW(lpwstrFile, hIcon, nIndex, 2, cxicon | (cxsmicon<<16),
886 cyicon | (cysmicon<<16), NULL, LR_DEFAULTCOLOR);
887#endif
888 *phIconLarge = hIcon[0];
889 *phIconSmall = hIcon[1];
890 return ret;
891 }
892
893 if (phIconSmall)
894 {
895 /* extract n small icons */
896 cxsmicon = GetSystemMetrics(SM_CXSMICON);
897 cysmicon = GetSystemMetrics(SM_CYSMICON);
898#ifdef __REACTOS__
899 ret = ICO_ExtractIconExW(lpwstrFile, phIconSmall, nIndex, nIcons, cxsmicon,
900 cysmicon, NULL, LR_DEFAULTCOLOR, FALSE);
901#else
902 ret = ICO_ExtractIconExW(lpwstrFile, phIconSmall, nIndex, nIcons, cxsmicon,
903 cysmicon, NULL, LR_DEFAULTCOLOR);
904#endif
905 }
906 if (phIconLarge)
907 {
908 /* extract n large icons */
909 cxicon = GetSystemMetrics(SM_CXICON);
910 cyicon = GetSystemMetrics(SM_CYICON);
911#ifdef __REACTOS__
912 ret = ICO_ExtractIconExW(lpwstrFile, phIconLarge, nIndex, nIcons, cxicon,
913 cyicon, NULL, LR_DEFAULTCOLOR, FALSE);
914#else
915 ret = ICO_ExtractIconExW(lpwstrFile, phIconLarge, nIndex, nIcons, cxicon,
916 cyicon, NULL, LR_DEFAULTCOLOR);
917#endif
918 }
919 return ret;
920}
static UINT ICO_ExtractIconExW(LPCWSTR lpszExeFileName, HICON *RetPtr, INT nIconIndex, UINT nIcons, UINT cxDesired, UINT cyDesired, UINT *pIconId, UINT flags)
Definition: exticon.c:280
HICON hIcon
Definition: msconfig.c:44
#define SM_CYSMICON
Definition: winuser.h:1007
#define SM_CXSMICON
Definition: winuser.h:1006
#define SM_CYICON
Definition: winuser.h:967
#define LR_DEFAULTCOLOR
Definition: winuser.h:1081
#define SM_CXICON
Definition: winuser.h:966
int WINAPI GetSystemMetrics(_In_ int)

Referenced by ExtractIconExW(), and PrivateExtractIconExA().

◆ PrivateExtractIconsA()

UINT WINAPI PrivateExtractIconsA ( LPCSTR  lpstrFile,
int  nIndex,
int  sizeX,
int  sizeY,
HICON phicon,
UINT piconid,
UINT  nIcons,
UINT  flags 
)

Definition at line 817 of file exticon.c.

826{
827 UINT ret;
828 INT len = MultiByteToWideChar(CP_ACP, 0, lpstrFile, -1, NULL, 0);
829 LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
830#ifdef __REACTOS__
831 if (lpwstrFile == NULL)
832 return 0;
833#endif
834
835 MultiByteToWideChar(CP_ACP, 0, lpstrFile, -1, lpwstrFile, len);
836 ret = PrivateExtractIconsW(lpwstrFile, nIndex, sizeX, sizeY, phicon, piconid, nIcons, flags);
837
838 HeapFree(GetProcessHeap(), 0, lpwstrFile);
839 return ret;
840}
UINT WINAPI PrivateExtractIconsW(LPCWSTR lpwstrFile, int nIndex, int sizeX, int sizeY, HICON *phicon, UINT *pIconId, UINT nIcons, UINT flags)
Definition: exticon.c:788

◆ PrivateExtractIconsW()

UINT WINAPI PrivateExtractIconsW ( LPCWSTR  lpwstrFile,
int  nIndex,
int  sizeX,
int  sizeY,
HICON phicon,
UINT pIconId,
UINT  nIcons,
UINT  flags 
)

Definition at line 788 of file exticon.c.

797{
798 TRACE("%s %d %dx%d %p %p %d 0x%08x\n",
799 debugstr_w(lpwstrFile), nIndex, sizeX, sizeY, phicon, pIconId, nIcons, flags);
800
801 if ((nIcons & 1) && HIWORD(sizeX) && HIWORD(sizeY))
802 {
803 WARN("Uneven number %d of icons requested for small and large icons!\n", nIcons);
804 }
805#ifdef __REACTOS__
806 return ICO_ExtractIconExW(lpwstrFile, phicon, nIndex, nIcons, sizeX, sizeY,
807 pIconId, flags, TRUE);
808#else
809 return ICO_ExtractIconExW(lpwstrFile, phicon, nIndex, nIcons, sizeX, sizeY, pIconId, flags);
810#endif
811}

Referenced by PrivateExtractIconsA().

◆ USER32_GetResourceTable()

static DWORD USER32_GetResourceTable ( LPBYTE  peimage,
DWORD  pesize,
LPBYTE retptr 
)
static

Definition at line 163 of file exticon.c.

164{
165 IMAGE_DOS_HEADER * mz_header;
166
167 TRACE("%p %p\n", peimage, retptr);
168
169 *retptr = NULL;
170
171 mz_header = (IMAGE_DOS_HEADER*) peimage;
172
173 if (mz_header->e_magic != IMAGE_DOS_SIGNATURE)
174 {
175 if (mz_header->e_cblp == 1 || mz_header->e_cblp == 2) /* .ICO or .CUR file ? */
176 {
177 *retptr = (LPBYTE)-1; /* ICONHEADER.idType, must be 1 */
178 return mz_header->e_cblp;
179 }
180 else
181 return 0; /* failed */
182 }
183 if (mz_header->e_lfanew >= pesize) {
184 return 0; /* failed, happens with PKZIP DOS Exes for instance. */
185 }
186 if (*((DWORD*)(peimage + mz_header->e_lfanew)) == IMAGE_NT_SIGNATURE )
187 return IMAGE_NT_SIGNATURE;
188
189 if (*((WORD*)(peimage + mz_header->e_lfanew)) == IMAGE_OS2_SIGNATURE )
190 {
191 IMAGE_OS2_HEADER * ne_header;
192
193 ne_header = (IMAGE_OS2_HEADER*)(peimage + mz_header->e_lfanew);
194
195 if (ne_header->ne_magic != IMAGE_OS2_SIGNATURE)
196 return 0;
197
198 if( (ne_header->ne_restab - ne_header->ne_rsrctab) <= sizeof(NE_TYPEINFO) )
199 *retptr = (LPBYTE)-1;
200 else
201 *retptr = peimage + mz_header->e_lfanew + ne_header->ne_rsrctab;
202
203 return IMAGE_OS2_SIGNATURE;
204 }
205 return 0; /* failed */
206}
#define IMAGE_DOS_SIGNATURE
Definition: pedump.c:89

Referenced by ICO_ExtractIconExW().

◆ USER32_LoadResource()

static BYTE * USER32_LoadResource ( LPBYTE  peimage,
NE_NAMEINFO pNInfo,
WORD  sizeShift,
ULONG uSize 
)
static

Definition at line 210 of file exticon.c.

211{
212 TRACE("%p %p 0x%08x\n", peimage, pNInfo, sizeShift);
213
214 *uSize = (DWORD)pNInfo->length << sizeShift;
215 return peimage + ((DWORD)pNInfo->offset << sizeShift);
216}
#define DWORD
Definition: nt_native.h:44
WORD offset
Definition: typelib.c:81
WORD length
Definition: typelib.c:82

Referenced by ICO_ExtractIconExW().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( icon  )