[SHELL32] Add missing desktop.ini files (#640)

Add the "desktop.ini" files to the special folders to realize their custom icons.
CORE-10045
This commit is contained in:
Katayama Hirofumi MZ 2018-06-28 06:11:31 +09:00 committed by Hermès BÉLUSCA - MAÏTO
parent 089ff1511d
commit 3189ec9428

View file

@ -3,6 +3,7 @@
* *
* Copyright 1998, 1999, 2000 Juergen Schmied * Copyright 1998, 1999, 2000 Juergen Schmied
* Copyright 2004 Juan Lang * Copyright 2004 Juan Lang
* Copyright 2018 Katayama Hirofumi MZ
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -36,6 +37,7 @@
#include <undocshell.h> #include <undocshell.h>
#include <shlwapi.h> #include <shlwapi.h>
#include <sddl.h> #include <sddl.h>
#include <strsafe.h>
#include <wine/debug.h> #include <wine/debug.h>
#include <wine/unicode.h> #include <wine/unicode.h>
@ -661,6 +663,7 @@ typedef struct
CSIDL_Type type; CSIDL_Type type;
LPCWSTR szValueName; LPCWSTR szValueName;
LPCWSTR szDefaultPath; /* fallback string or resource ID */ LPCWSTR szDefaultPath; /* fallback string or resource ID */
INT nShell32IconIndex;
} CSIDL_DATA; } CSIDL_DATA;
static const CSIDL_DATA CSIDL_Data[] = static const CSIDL_DATA CSIDL_Data[] =
@ -669,7 +672,8 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_Desktop, &FOLDERID_Desktop,
CSIDL_Type_User, CSIDL_Type_User,
DesktopW, DesktopW,
MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY),
-IDI_SHELL_DESKTOP
}, },
{ /* 0x01 - CSIDL_INTERNET */ { /* 0x01 - CSIDL_INTERNET */
&FOLDERID_InternetFolder, &FOLDERID_InternetFolder,
@ -681,31 +685,36 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_Programs, &FOLDERID_Programs,
CSIDL_Type_User, CSIDL_Type_User,
ProgramsW, ProgramsW,
MAKEINTRESOURCEW(IDS_PROGRAMS) MAKEINTRESOURCEW(IDS_PROGRAMS),
-IDI_SHELL_PROGRAMS_FOLDER
}, },
{ /* 0x03 - CSIDL_CONTROLS (.CPL files) */ { /* 0x03 - CSIDL_CONTROLS (.CPL files) */
&FOLDERID_ControlPanelFolder, &FOLDERID_ControlPanelFolder,
CSIDL_Type_SystemPath, CSIDL_Type_SystemPath,
NULL, NULL,
NULL NULL,
-IDI_SHELL_CONTROL_PANEL
}, },
{ /* 0x04 - CSIDL_PRINTERS */ { /* 0x04 - CSIDL_PRINTERS */
&FOLDERID_PrintersFolder, &FOLDERID_PrintersFolder,
CSIDL_Type_SystemPath, CSIDL_Type_SystemPath,
NULL, NULL,
NULL NULL,
-IDI_SHELL_PRINTERS_FOLDER
}, },
{ /* 0x05 - CSIDL_PERSONAL */ { /* 0x05 - CSIDL_PERSONAL */
&FOLDERID_Documents, &FOLDERID_Documents,
CSIDL_Type_User, CSIDL_Type_User,
PersonalW, PersonalW,
MAKEINTRESOURCEW(IDS_PERSONAL) MAKEINTRESOURCEW(IDS_PERSONAL),
-IDI_SHELL_MY_DOCUMENTS
}, },
{ /* 0x06 - CSIDL_FAVORITES */ { /* 0x06 - CSIDL_FAVORITES */
&FOLDERID_Favorites, &FOLDERID_Favorites,
CSIDL_Type_User, CSIDL_Type_User,
FavoritesW, FavoritesW,
MAKEINTRESOURCEW(IDS_FAVORITES) MAKEINTRESOURCEW(IDS_FAVORITES),
-IDI_SHELL_FAVORITES
}, },
{ /* 0x07 - CSIDL_STARTUP */ { /* 0x07 - CSIDL_STARTUP */
&FOLDERID_Startup, &FOLDERID_Startup,
@ -717,7 +726,8 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_Recent, &FOLDERID_Recent,
CSIDL_Type_User, CSIDL_Type_User,
RecentW, RecentW,
MAKEINTRESOURCEW(IDS_RECENT) MAKEINTRESOURCEW(IDS_RECENT),
-IDI_SHELL_RECENT_DOCUMENTS
}, },
{ /* 0x09 - CSIDL_SENDTO */ { /* 0x09 - CSIDL_SENDTO */
&FOLDERID_SendTo, &FOLDERID_SendTo,
@ -729,31 +739,35 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_RecycleBinFolder, &FOLDERID_RecycleBinFolder,
CSIDL_Type_Disallowed, CSIDL_Type_Disallowed,
NULL, NULL,
NULL, NULL
}, },
{ /* 0x0b - CSIDL_STARTMENU */ { /* 0x0b - CSIDL_STARTMENU */
&FOLDERID_StartMenu, &FOLDERID_StartMenu,
CSIDL_Type_User, CSIDL_Type_User,
Start_MenuW, Start_MenuW,
MAKEINTRESOURCEW(IDS_STARTMENU) MAKEINTRESOURCEW(IDS_STARTMENU),
-IDI_SHELL_TSKBAR_STARTMENU
}, },
{ /* 0x0c - CSIDL_MYDOCUMENTS */ { /* 0x0c - CSIDL_MYDOCUMENTS */
&GUID_NULL, &GUID_NULL,
CSIDL_Type_Disallowed, /* matches WinXP--can't get its path */ CSIDL_Type_Disallowed, /* matches WinXP--can't get its path */
NULL, NULL,
NULL NULL,
-IDI_SHELL_MY_DOCUMENTS
}, },
{ /* 0x0d - CSIDL_MYMUSIC */ { /* 0x0d - CSIDL_MYMUSIC */
&FOLDERID_Music, &FOLDERID_Music,
CSIDL_Type_User, CSIDL_Type_User,
My_MusicW, My_MusicW,
MAKEINTRESOURCEW(IDS_MYMUSIC) MAKEINTRESOURCEW(IDS_MYMUSIC),
-IDI_SHELL_MY_MUSIC
}, },
{ /* 0x0e - CSIDL_MYVIDEO */ { /* 0x0e - CSIDL_MYVIDEO */
&FOLDERID_Videos, &FOLDERID_Videos,
CSIDL_Type_User, CSIDL_Type_User,
My_VideoW, My_VideoW,
MAKEINTRESOURCEW(IDS_MYVIDEO) MAKEINTRESOURCEW(IDS_MYVIDEO),
-IDI_SHELL_MY_MOVIES
}, },
{ /* 0x0f - unassigned */ { /* 0x0f - unassigned */
&GUID_NULL, &GUID_NULL,
@ -765,31 +779,36 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_Desktop, &FOLDERID_Desktop,
CSIDL_Type_User, CSIDL_Type_User,
DesktopW, DesktopW,
MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY),
-IDI_SHELL_DESKTOP
}, },
{ /* 0x11 - CSIDL_DRIVES */ { /* 0x11 - CSIDL_DRIVES */
&FOLDERID_ComputerFolder, &FOLDERID_ComputerFolder,
CSIDL_Type_Disallowed, CSIDL_Type_Disallowed,
NULL, NULL,
NULL, NULL,
-IDI_SHELL_COMPUTER_FOLDER
}, },
{ /* 0x12 - CSIDL_NETWORK */ { /* 0x12 - CSIDL_NETWORK */
&FOLDERID_NetworkFolder, &FOLDERID_NetworkFolder,
CSIDL_Type_Disallowed, CSIDL_Type_Disallowed,
NULL, NULL,
NULL, NULL,
-IDI_SHELL_NETWORK_FOLDER
}, },
{ /* 0x13 - CSIDL_NETHOOD */ { /* 0x13 - CSIDL_NETHOOD */
&FOLDERID_NetHood, &FOLDERID_NetHood,
CSIDL_Type_User, CSIDL_Type_User,
NetHoodW, NetHoodW,
MAKEINTRESOURCEW(IDS_NETHOOD) MAKEINTRESOURCEW(IDS_NETHOOD),
-IDI_SHELL_NETWORK
}, },
{ /* 0x14 - CSIDL_FONTS */ { /* 0x14 - CSIDL_FONTS */
&FOLDERID_Fonts, &FOLDERID_Fonts,
CSIDL_Type_WindowsPath, CSIDL_Type_WindowsPath,
FontsW, FontsW,
FontsW FontsW,
-IDI_SHELL_FONTS_FOLDER
}, },
{ /* 0x15 - CSIDL_TEMPLATES */ { /* 0x15 - CSIDL_TEMPLATES */
&FOLDERID_Templates, &FOLDERID_Templates,
@ -801,13 +820,15 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_CommonStartMenu, &FOLDERID_CommonStartMenu,
CSIDL_Type_AllUsers, CSIDL_Type_AllUsers,
Common_Start_MenuW, Common_Start_MenuW,
MAKEINTRESOURCEW(IDS_STARTMENU) MAKEINTRESOURCEW(IDS_STARTMENU),
-IDI_SHELL_TSKBAR_STARTMENU
}, },
{ /* 0x17 - CSIDL_COMMON_PROGRAMS */ { /* 0x17 - CSIDL_COMMON_PROGRAMS */
&FOLDERID_CommonPrograms, &FOLDERID_CommonPrograms,
CSIDL_Type_AllUsers, CSIDL_Type_AllUsers,
Common_ProgramsW, Common_ProgramsW,
MAKEINTRESOURCEW(IDS_PROGRAMS) MAKEINTRESOURCEW(IDS_PROGRAMS),
-IDI_SHELL_PROGRAMS_FOLDER
}, },
{ /* 0x18 - CSIDL_COMMON_STARTUP */ { /* 0x18 - CSIDL_COMMON_STARTUP */
&FOLDERID_CommonStartup, &FOLDERID_CommonStartup,
@ -819,7 +840,8 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_PublicDesktop, &FOLDERID_PublicDesktop,
CSIDL_Type_AllUsers, CSIDL_Type_AllUsers,
Common_DesktopW, Common_DesktopW,
MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY),
-IDI_SHELL_DESKTOP
}, },
{ /* 0x1a - CSIDL_APPDATA */ { /* 0x1a - CSIDL_APPDATA */
&FOLDERID_RoamingAppData, &FOLDERID_RoamingAppData,
@ -831,7 +853,8 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_PrintHood, &FOLDERID_PrintHood,
CSIDL_Type_User, CSIDL_Type_User,
PrintHoodW, PrintHoodW,
MAKEINTRESOURCEW(IDS_PRINTHOOD) MAKEINTRESOURCEW(IDS_PRINTHOOD),
-IDI_SHELL_PRINTERS_FOLDER
}, },
{ /* 0x1c - CSIDL_LOCAL_APPDATA */ { /* 0x1c - CSIDL_LOCAL_APPDATA */
&FOLDERID_LocalAppData, &FOLDERID_LocalAppData,
@ -855,7 +878,8 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_Favorites, &FOLDERID_Favorites,
CSIDL_Type_AllUsers, CSIDL_Type_AllUsers,
Common_FavoritesW, Common_FavoritesW,
MAKEINTRESOURCEW(IDS_FAVORITES) MAKEINTRESOURCEW(IDS_FAVORITES),
-IDI_SHELL_FAVORITES
}, },
{ /* 0x20 - CSIDL_INTERNET_CACHE */ { /* 0x20 - CSIDL_INTERNET_CACHE */
&FOLDERID_InternetCache, &FOLDERID_InternetCache,
@ -885,25 +909,29 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_Windows, &FOLDERID_Windows,
CSIDL_Type_WindowsPath, CSIDL_Type_WindowsPath,
NULL, NULL,
NULL NULL,
-IDI_SHELL_SYSTEM_GEAR
}, },
{ /* 0x25 - CSIDL_SYSTEM */ { /* 0x25 - CSIDL_SYSTEM */
&FOLDERID_System, &FOLDERID_System,
CSIDL_Type_SystemPath, CSIDL_Type_SystemPath,
NULL, NULL,
NULL NULL,
-IDI_SHELL_SYSTEM_GEAR
}, },
{ /* 0x26 - CSIDL_PROGRAM_FILES */ { /* 0x26 - CSIDL_PROGRAM_FILES */
&FOLDERID_ProgramFiles, &FOLDERID_ProgramFiles,
CSIDL_Type_CurrVer, CSIDL_Type_CurrVer,
ProgramFilesDirW, ProgramFilesDirW,
MAKEINTRESOURCEW(IDS_PROGRAM_FILES) MAKEINTRESOURCEW(IDS_PROGRAM_FILES),
-IDI_SHELL_PROGRAMS_FOLDER
}, },
{ /* 0x27 - CSIDL_MYPICTURES */ { /* 0x27 - CSIDL_MYPICTURES */
&FOLDERID_Pictures, &FOLDERID_Pictures,
CSIDL_Type_User, CSIDL_Type_User,
My_PicturesW, My_PicturesW,
MAKEINTRESOURCEW(IDS_MYPICTURES) MAKEINTRESOURCEW(IDS_MYPICTURES),
-IDI_SHELL_MY_PICTURES
}, },
{ /* 0x28 - CSIDL_PROFILE */ { /* 0x28 - CSIDL_PROFILE */
&FOLDERID_Profile, &FOLDERID_Profile,
@ -915,19 +943,22 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_SystemX86, &FOLDERID_SystemX86,
CSIDL_Type_SystemX86Path, CSIDL_Type_SystemX86Path,
NULL, NULL,
NULL NULL,
-IDI_SHELL_SYSTEM_GEAR
}, },
{ /* 0x2a - CSIDL_PROGRAM_FILESX86 */ { /* 0x2a - CSIDL_PROGRAM_FILESX86 */
&FOLDERID_ProgramFilesX86, &FOLDERID_ProgramFilesX86,
CSIDL_Type_CurrVer, CSIDL_Type_CurrVer,
ProgramFilesDirX86W, ProgramFilesDirX86W,
Program_Files_x86W Program_Files_x86W,
-IDI_SHELL_PROGRAMS_FOLDER
}, },
{ /* 0x2b - CSIDL_PROGRAM_FILES_COMMON */ { /* 0x2b - CSIDL_PROGRAM_FILES_COMMON */
&FOLDERID_ProgramFilesCommon, &FOLDERID_ProgramFilesCommon,
CSIDL_Type_CurrVer, CSIDL_Type_CurrVer,
CommonFilesDirW, CommonFilesDirW,
MAKEINTRESOURCEW(IDS_PROGRAM_FILES_COMMON) MAKEINTRESOURCEW(IDS_PROGRAM_FILES_COMMON),
-IDI_SHELL_PROGRAMS_FOLDER
}, },
{ /* 0x2c - CSIDL_PROGRAM_FILES_COMMONX86 */ { /* 0x2c - CSIDL_PROGRAM_FILES_COMMONX86 */
&FOLDERID_ProgramFilesCommonX86, &FOLDERID_ProgramFilesCommonX86,
@ -945,7 +976,8 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_PublicDocuments, &FOLDERID_PublicDocuments,
CSIDL_Type_AllUsers, CSIDL_Type_AllUsers,
Common_DocumentsW, Common_DocumentsW,
MAKEINTRESOURCEW(IDS_PERSONAL) MAKEINTRESOURCEW(IDS_PERSONAL),
-IDI_SHELL_MY_DOCUMENTS
}, },
{ /* 0x2f - CSIDL_COMMON_ADMINTOOLS */ { /* 0x2f - CSIDL_COMMON_ADMINTOOLS */
&FOLDERID_CommonAdminTools, &FOLDERID_CommonAdminTools,
@ -963,7 +995,8 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_ConnectionsFolder, &FOLDERID_ConnectionsFolder,
CSIDL_Type_Disallowed, CSIDL_Type_Disallowed,
NULL, NULL,
NULL NULL,
-IDI_SHELL_NETWORK_CONNECTIONS
}, },
{ /* 0x32 - unassigned */ { /* 0x32 - unassigned */
&GUID_NULL, &GUID_NULL,
@ -987,19 +1020,22 @@ static const CSIDL_DATA CSIDL_Data[] =
&FOLDERID_PublicMusic, &FOLDERID_PublicMusic,
CSIDL_Type_AllUsers, CSIDL_Type_AllUsers,
CommonMusicW, CommonMusicW,
MAKEINTRESOURCEW(IDS_COMMON_MUSIC) MAKEINTRESOURCEW(IDS_COMMON_MUSIC),
-IDI_SHELL_MY_MUSIC
}, },
{ /* 0x36 - CSIDL_COMMON_PICTURES */ { /* 0x36 - CSIDL_COMMON_PICTURES */
&FOLDERID_PublicPictures, &FOLDERID_PublicPictures,
CSIDL_Type_AllUsers, CSIDL_Type_AllUsers,
CommonPicturesW, CommonPicturesW,
MAKEINTRESOURCEW(IDS_COMMON_PICTURES) MAKEINTRESOURCEW(IDS_COMMON_PICTURES),
-IDI_SHELL_MY_PICTURES
}, },
{ /* 0x37 - CSIDL_COMMON_VIDEO */ { /* 0x37 - CSIDL_COMMON_VIDEO */
&FOLDERID_PublicVideos, &FOLDERID_PublicVideos,
CSIDL_Type_AllUsers, CSIDL_Type_AllUsers,
CommonVideoW, CommonVideoW,
MAKEINTRESOURCEW(IDS_COMMON_VIDEO) MAKEINTRESOURCEW(IDS_COMMON_VIDEO),
-IDI_SHELL_MY_MOVIES
}, },
{ /* 0x38 - CSIDL_RESOURCES */ { /* 0x38 - CSIDL_RESOURCES */
&FOLDERID_ResourceDir, &FOLDERID_ResourceDir,
@ -2130,6 +2166,38 @@ HRESULT WINAPI SHGetFolderPathAndSubDirW(
} }
TRACE("Created missing system directory %s\n", debugstr_w(szBuildPath)); TRACE("Created missing system directory %s\n", debugstr_w(szBuildPath));
/* create desktop.ini for custom icon */
if (CSIDL_Data[folder].nShell32IconIndex)
{
static const WCHAR s_szFormat[] = L"%%SystemRoot%%\\system32\\shell32.dll,%d";
WCHAR szIconLocation[MAX_PATH];
DWORD dwAttributes;
/* make the directory a system folder */
dwAttributes = GetFileAttributesW(szBuildPath);
dwAttributes |= FILE_ATTRIBUTE_SYSTEM;
SetFileAttributesW(szBuildPath, dwAttributes);
/* build the desktop.ini file path */
PathAppendW(szBuildPath, L"desktop.ini");
/* build the icon location */
StringCchPrintfW(szIconLocation, _countof(szIconLocation), s_szFormat,
CSIDL_Data[folder].nShell32IconIndex);
/* write desktop.ini */
WritePrivateProfileStringW(L".ShellClassInfo", L"IconResource", szIconLocation, szBuildPath);
/* flush! */
WritePrivateProfileStringW(NULL, NULL, NULL, szBuildPath);
/* make the desktop.ini a system and hidden file */
dwAttributes = GetFileAttributesW(szBuildPath);
dwAttributes |= FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;
SetFileAttributesW(szBuildPath, dwAttributes);
}
end: end:
TRACE("returning 0x%08x (final path is %s)\n", hr, debugstr_w(szBuildPath)); TRACE("returning 0x%08x (final path is %s)\n", hr, debugstr_w(szBuildPath));
return hr; return hr;