27 #define INVALID_INDEX -1 50 0, 0, { (
DWORD_PTR)(__FILE__
": SHELL32_SicCS") }
74 if ((e1->
dwFlags & GIL_FORSHORTCUT) != (e2->dwFlags & GIL_FORSHORTCUT))
75 return ((e1->
dwFlags & GIL_FORSHORTCUT) < (e2->dwFlags & GIL_FORSHORTCUT)) ? -1 : 1;
93 ICONINFO ShortcutIconInfo, TargetIconInfo;
95 BITMAP TargetBitmapInfo, ShortcutBitmapInfo;
99 OldTargetBitmap =
NULL;
101 static int s_imgListIdx = -1;
102 ZeroMemory(&ShortcutIconInfo,
sizeof(ShortcutIconInfo));
103 ZeroMemory(&TargetIconInfo,
sizeof(TargetIconInfo));
114 FIXME(
"1bpp icon wants its overlay!\n");
124 if (s_imgListIdx == -1)
130 if (s_imgListIdx != -1)
139 if (!ShortcutIcon || !
GetIconInfo(ShortcutIcon, &ShortcutIconInfo))
148 FIXME(
"Should draw 1bpp overlay!\n");
159 if (
NULL == ShortcutDC)
goto fail;
161 if (
NULL == OldShortcutBitmap)
goto fail;
164 if (
NULL == TargetDC)
goto fail;
166 if (
NULL == OldTargetBitmap)
goto fail;
170 if (!
BitBlt(TargetDC, 0, 0, ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
171 ShortcutDC, 0, 0,
SRCAND))
186 if(ShortcutBitmapInfo.bmBitsPixel == 32)
196 if(TargetBitmapInfo.bmBitsPixel != 32) add_alpha =
FALSE;
212 ERR(
"GetBIBits failed!\n");
220 for(
i=0;
i<TargetBitmapInfo.bmHeight;
i++)
222 for(
j=0;
j<TargetBitmapInfo.bmWidth;
j++)
224 add_alpha = (*pixel++ & 0xFF000000) != 0;
245 ERR(
"GetBIBits failed!\n");
252 for(
i=0;
i<ShortcutBitmapInfo.bmHeight;
i++)
254 for(
j=0;
j<ShortcutBitmapInfo.bmWidth;
j++)
256 if(add_alpha) *pixel++ |= 0xFF000000;
257 else *pixel++ &= 0x00FFFFFF;
278 if (!
MaskBlt(TargetDC, 0, 0, ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
279 ShortcutDC, 0, 0, ShortcutIconInfo.
hbmMask, 0, 0,
331 TRACE(
"%s %i %p %p\n",
debugstr_w(sSourceFile), dwSourceIndex, hSmallIcon ,hBigIcon);
346 if ( -1 == indexDPA )
356 if((
index == -1) || (index1 == -1))
358 WARN(
"Something went wrong when adding the icon to the list: small - 0x%x, big - 0x%x.\n",
368 FIXME(
"iconlists out of sync 0x%x 0x%x\n",
index, index1);
399 if ( !hiconLarge || !hiconSmall)
401 WARN(
"failure loading icon %i from %s (%p %p)\n", dwSourceIndex,
debugstr_w(sSourceFile), hiconLarge, hiconSmall);
407 if (0 != (
dwFlags & GIL_FORSHORTCUT))
411 if (
NULL != hiconLargeShortcut &&
NULL != hiconSmallShortcut)
415 hiconLarge = hiconLargeShortcut;
416 hiconSmall = hiconSmallShortcut;
420 WARN(
"Failed to create shortcut overlayed icons\n");
487 INT cx_small, cy_small;
488 INT cx_large, cy_large;
494 TRACE(
"Entered SIC_Initialize\n");
498 TRACE(
"Icon cache already initialized\n");
511 ERR(
"Failed to create information context (error %d)\n",
GetLastError());
545 ERR(
"Failed to create the small icon list.\n");
556 ERR(
"Failed to create the big icon list.\n");
569 ERR(
"Failed to load small IDI_SHELL_DOCUMENT icon!\n");
581 ERR(
"Failed to load large IDI_SHELL_DOCUMENT icon!\n");
587 ERR(
"Failed to add IDI_SHELL_DOCUMENT icon to cache.\n");
592 ERR(
"Failed to add IDI_SHELL_DOCUMENT icon to cache.\n");
662 static const WCHAR wszShellIcons[] = {
663 'S',
'o',
'f',
't',
'w',
'a',
'r',
'e',
'\\',
'M',
'i',
'c',
'r',
'o',
's',
'o',
'f',
't',
'\\',
664 'W',
'i',
'n',
'd',
'o',
'w',
's',
'\\',
'C',
'u',
'r',
'r',
'e',
'n',
't',
'V',
'e',
'r',
's',
'i',
'o',
'n',
'\\',
665 'E',
'x',
'p',
'l',
'o',
'r',
'e',
'r',
'\\',
'S',
'h',
'e',
'l',
'l',
' ',
'I',
'c',
'o',
'n',
's',0
667 static const WCHAR wszNumFmt[] = {
'%',
'd',0};
676 swprintf(wszIdx, wszNumFmt, icon_idx);
708 TRACE(
"(%p,%p)\n",lpBigList,lpSmallList);
746 TRACE(
"sf=%p pidl=%p %s\n",
sh, pidl, bBigIcon?
"Big":
"Small");
762 if (0 == (
uFlags & GIL_FORSHORTCUT))
801 uGilFlags |= GIL_FORSHORTCUT;
819 int *piIndex,
int *piIndexSel)
821 FIXME(
"(%p, %p, %p, 0x%08x, %p, %p, %p, %p, %p)\n",
822 pts, psf, pidl,
flags, pfn,
pvData, pvHint, piIndex, piIndexSel);
876 #if defined(__CYGWIN__) || defined (__MINGW32__) || defined(_MSC_VER) 888 TRACE(
"%s %i %p %p %i\n",
debugstr_w(lpszFile), nIconIndex, phiconLarge, phiconSmall, nIcons);
902 TRACE(
"%s %i %p %p %i\n", lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
956 lpiIcon = &wDummyIcon;
965 if( uRet > (
HINSTANCE)32 && tempPath[0] )
966 {
wcscpy(lpIconPath,tempPath);
1008 TRACE(
"%p %s %p %p)\n",
hInst, lpIconPath, lpiIconIdx, lpiIconId);
1025 WARN(
"%s %d 0x%08x %p %p %d, semi-stub\n",
debugstr_w(pszIconFile), iIndex,
uFlags, phiconLarge, phiconSmall, nIconSize);
1029 if (
ret == 0xFFFFFFFF)
1033 *phiconLarge = hIcons[0];
1037 *phiconSmall = hIcons[1];
1055 TRACE(
"%s %d 0x%08x %p %p %d\n", pszIconFile, iIndex,
uFlags, phiconLarge, phiconSmall, nIconSize);
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
EXTERN_C INT WINAPI Shell_GetCachedImageIndexAW(LPCVOID szPath, INT nIndex, BOOL bSimulateDoc)
void WINAPI DPA_DestroyCallback(HDPA hdpa, PFNDPAENUMCALLBACK enumProc, LPVOID lParam)
static HIMAGELIST ShellBigIconList
HDPA WINAPI DPA_Create(INT nGrow)
BITMAPINFOHEADER bmiHeader
#define WideCharToMultiByte
BOOL WINAPI DPA_Destroy(HDPA hdpa)
BOOL WINAPI DestroyIcon(_In_ HICON)
GLsizei const GLchar ** path
HRESULT WINAPI SHDefExtractIconA(LPCSTR pszIconFile, int iIndex, UINT uFlags, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
struct tagBITMAPINFOHEADER BITMAPINFOHEADER
GLuint GLuint GLsizei count
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
WCHAR swShell32Name[MAX_PATH]
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
DWORD WINAPI GetLastError(VOID)
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
static int SIC_LoadOverlayIcon(int icon_idx)
EXTERN_C HRESULT WINAPI SHMapIDListToImageListIndexAsync(IShellTaskScheduler *pts, IShellFolder *psf, LPCITEMIDLIST pidl, UINT flags, PFNASYNCICONTASKBALLBACK pfn, void *pvData, void *pvHint, int *piIndex, int *piIndexSel)
static __inline BOOL SHELL_OsIsUnicode(void)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
static VOID NTAPI BitBlt(IN ULONG Left, IN ULONG Top, IN ULONG Width, IN ULONG Height, IN PUCHAR Buffer, IN ULONG BitsPerPixel, IN ULONG Delta)
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
BOOL WINAPI GetIconInfo(_In_ HICON, _Out_ PICONINFO)
INT WINAPI Shell_GetCachedImageIndexW(LPCWSTR szPath, INT nIndex, UINT bSimulateDoc)
static INT SIC_IconAppend(LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon, DWORD dwFlags)
HICON WINAPI ExtractIconW(HINSTANCE hInstance, LPCWSTR lpszFile, UINT nIconIndex)
EXTERN_C INT WINAPI SHGetIconOverlayIndexW(LPCWSTR pszIconPath, INT iIconIndex)
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
static HIMAGELIST ShellSmallIconList
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
LONG WINAPI RegCloseKey(HKEY hKey)
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
HICON WINAPI ExtractAssociatedIconW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIcon)
HINSTANCE shell32_hInstance
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_ UINT, _In_ int, _In_ int, _In_ UINT)
UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons)
static UINT WPARAM LPARAM lparam
_In_ ULONG _In_opt_ PVOID pvData
HICON WINAPI ExtractAssociatedIconA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIcon)
BOOL SHELL_IsShortcut(LPCITEMIDLIST pidlLast)
UINT WINAPI WINAPI PrivateExtractIconExW(LPCWSTR, int, HICON *, HICON *, UINT)
static INT SIC_LoadIcon(LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags)
#define IDI_SHELL_SHORTCUT
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 GLint GLint j
#define IID_NULL_PPV_ARG(Itype, ppType)
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
static INT CALLBACK SIC_CompareEntries(LPVOID p1, LPVOID p2, LPARAM lparam)
EXTERN_C INT WINAPI Shell_GetCachedImageIndex(LPCWSTR szPath, INT nIndex, UINT bSimulateDoc)
HICON WINAPI ImageList_GetIcon(HIMAGELIST himl, INT i, UINT fStyle)
HICON WINAPI CreateIconIndirect(_In_ PICONINFO)
UINT WINAPI ExtractIconExA(LPCSTR lpszFile, INT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons)
#define swprintf(buf, format,...)
UINT WINAPI PrivateExtractIconsW(_In_reads_(MAX_PATH) LPCWSTR szFileName, _In_ int nIconIndex, _In_ int cxIcon, _In_ int cyIcon, _Out_writes_opt_(nIcons) HICON *phicon, _Out_writes_opt_(nIcons) UINT *piconid, _In_ UINT nIcons, _In_ UINT flags)
void(CALLBACK * PFNASYNCICONTASKBALLBACK)(LPCITEMIDLIST pidl, LPVOID pvData, LPVOID pvHint, INT iIconIndex, INT iOpenIconIndex)
static const UCHAR Index[8]
int WINAPI GetSystemMetrics(_In_ int)
static INT CALLBACK sic_free(LPVOID ptr, LPVOID lparam)
EXTERN_C INT WINAPI SHGetIconOverlayIndexA(LPCSTR pszIconPath, INT iIconIndex)
INT WINAPI ImageList_AddIcon(HIMAGELIST himl, HICON hIcon)
HINSTANCE WINAPI FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult)
BOOL WINAPI ImageList_Remove(HIMAGELIST himl, INT i)
CRITICAL_SECTION_DEBUG critsect_debug
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define IDI_SHELL_DOCUMENT
INT WINAPI DPA_InsertPtr(HDPA hdpa, INT i, LPVOID p)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
LIST_ENTRY ProcessLocksList
CRITICAL_SECTION SHELL32_SicCS
static HICON SIC_OverlayShortcutImage(HICON SourceIcon, BOOL large)
BOOL WINAPI Shell_GetImageLists(HIMAGELIST *lpBigList, HIMAGELIST *lpSmallList)
INT WINAPI Shell_GetCachedImageIndexA(LPCSTR szPath, INT nIndex, UINT bSimulateDoc)
BOOL SIC_Initialize(void)
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
#define LR_COPYFROMRESOURCE
_Out_ PULONG _Out_ PULONG pIndex
BOOL WINAPI DeleteDC(_In_ HDC)
void shell(int argc, const char *argv[])
void pdump(LPCITEMIDLIST pidl)
struct SIC_ENTRY * LPSIC_ENTRY
INT SIC_GetIconIndex(LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags)
HDC WINAPI CreateICW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_opt_ const DEVMODEW *)
#define MultiByteToWideChar
void WINAPI SHFree(LPVOID pv)
int WINAPI GetDIBits(_In_ HDC hdc, _In_ HBITMAP hbm, _In_ UINT start, _In_ UINT cLines, _Out_opt_ LPVOID lpvBits, _At_((LPBITMAPINFOHEADER) lpbmi, _Inout_) LPBITMAPINFO lpbmi, _In_ UINT usage)
LPVOID WINAPI DPA_DeletePtr(HDPA hdpa, INT i)
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
HRESULT WINAPI SHDefExtractIconW(LPCWSTR pszIconFile, int iIndex, UINT uFlags, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
BOOL WINAPI MaskBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ HDC, _In_ int, _In_ int, _In_ HBITMAP, _In_ int, _In_ int, _In_ DWORD)
BOOL PidlToSicIndex(IShellFolder *sh, LPCITEMIDLIST pidl, BOOL bBigIcon, UINT uFlags, int *pIndex)
#define GetProcAddress(x, y)
#define MAKEINTRESOURCEW(i)
EXTERN_C HICON WINAPI ExtractAssociatedIconExW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIconIdx, LPWORD lpiIconId)
EXTERN_C HICON WINAPI ExtractAssociatedIconExA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIconIdx, LPWORD lpiIconId)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
WINE_DEFAULT_DEBUG_CHANNEL(shell)
int WINAPI SetDIBits(_In_opt_ HDC, _In_ HBITMAP, _In_ UINT, _In_ UINT, _In_ CONST VOID *, _In_ CONST BITMAPINFO *, _In_ UINT)
LPVOID WINAPI SHAlloc(SIZE_T len)
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
INT WINAPI DPA_Search(HDPA hdpa, LPVOID pFind, INT nStart, PFNDPACOMPARE pfnCompare, LPARAM lParam, UINT uOptions)
#define HeapFree(x, y, z)
struct tagBITMAPINFO BITMAPINFO
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
#define HKEY_LOCAL_MACHINE