diff --git a/dlls/shell32/shell32_En.rc b/dlls/shell32/shell32_En.rc index ce7d63d8a0d..6fb4c6c0317 100644 --- a/dlls/shell32/shell32_En.rc +++ b/dlls/shell32/shell32_En.rc @@ -284,6 +284,24 @@ STRINGTABLE IDS_COMMON_PICTURES "Pictures" IDS_COMMON_VIDEO "Videos" IDS_CDBURN_AREA "Local Settings\\Application Data\\Microsoft\\CD Burning" + IDS_CONTACTS "Contacts" + IDS_LINKS "Links" + IDS_PHOTO_ALBUMS "Pictures\\Slide Shows" + IDS_PLAYLISTS "Music\\Playlists" + IDS_PUBLIC_DOWNLOADS "Downloads" + IDS_PUBLIC_GAME_TASKS "Microsoft\\Windows\\GameExplorer" + IDS_PUBLIC_LIBRARIES "Microsoft\\Windows\\Libraries" + IDS_PUBLIC_RINGTONES "Microsoft\\Windows\\Ringtones" + IDS_SAMPLE_MUSIC "Music\\Sample Music" + IDS_SAMPLE_PICTURES "Pictures\\Sample Pictures" + IDS_SAMPLE_PLAYLISTS "Music\\Sample Playlists" + IDS_SAMPLE_VIDEOS "Videos\\Sample Videos" + IDS_SAVED_GAMES "Saved Games" + IDS_SAVED_SEARCHES "Searches" + IDS_USER_PROFILES "Users" + IDS_COMMON_OEM_LINKS "OEM Links" + IDS_DOCUMENTS "Documents" + IDS_DOWNLOADS "Downloads" IDS_NEWFOLDER "New Folder" diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index 8daa875158d..0eafdc1a1ea 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -49,6 +49,8 @@ #include "shlwapi.h" #include "xdg.h" #include "sddl.h" +#define INITGUID +#include "knownfolders.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); @@ -775,6 +777,7 @@ static const WCHAR Common_StartUpW[] = {'C','o','m','m','o','n',' ','S','t','a', static const WCHAR Common_Start_MenuW[] = {'C','o','m','m','o','n',' ','S','t','a','r','t',' ','M','e','n','u','\0'}; static const WCHAR Common_TemplatesW[] = {'C','o','m','m','o','n',' ','T','e','m','p','l','a','t','e','s','\0'}; static const WCHAR CommonVideoW[] = {'C','o','m','m','o','n','V','i','d','e','o','\0'}; +static const WCHAR ContactsW[] = {'C','o','n','t','a','c','t','s','\0'}; static const WCHAR CookiesW[] = {'C','o','o','k','i','e','s','\0'}; static const WCHAR DesktopW[] = {'D','e','s','k','t','o','p','\0'}; static const WCHAR FavoritesW[] = {'F','a','v','o','r','i','t','e','s','\0'}; @@ -796,6 +799,8 @@ static const WCHAR SendToW[] = {'S','e','n','d','T','o','\0'}; static const WCHAR StartUpW[] = {'S','t','a','r','t','U','p','\0'}; static const WCHAR Start_MenuW[] = {'S','t','a','r','t',' ','M','e','n','u','\0'}; static const WCHAR TemplatesW[] = {'T','e','m','p','l','a','t','e','s','\0'}; +static const WCHAR UsersW[] = {'U','s','e','r','s','\0'}; +static const WCHAR UsersPublicW[] = {'U','s','e','r','s','\\','P','u','b','l','i','c','\0'}; static const WCHAR DefaultW[] = {'.','D','e','f','a','u','l','t','\0'}; static const WCHAR AllUsersProfileW[] = {'%','A','L','L','U','S','E','R','S','P','R','O','F','I','L','E','%','\0'}; static const WCHAR UserProfileW[] = {'%','U','S','E','R','P','R','O','F','I','L','E','%','\0'}; @@ -821,6 +826,7 @@ typedef enum _CSIDL_Type { typedef struct { + const KNOWNFOLDERID *id; CSIDL_Type type; LPCWSTR szValueName; LPCWSTR szDefaultPath; /* fallback string or resource ID */ @@ -829,319 +835,694 @@ typedef struct static const CSIDL_DATA CSIDL_Data[] = { { /* 0x00 - CSIDL_DESKTOP */ + &FOLDERID_Desktop, CSIDL_Type_User, DesktopW, MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) }, { /* 0x01 - CSIDL_INTERNET */ + &FOLDERID_InternetFolder, CSIDL_Type_Disallowed, NULL, NULL }, { /* 0x02 - CSIDL_PROGRAMS */ + &FOLDERID_Programs, CSIDL_Type_User, ProgramsW, MAKEINTRESOURCEW(IDS_PROGRAMS) }, { /* 0x03 - CSIDL_CONTROLS (.CPL files) */ + &FOLDERID_ControlPanelFolder, CSIDL_Type_SystemPath, NULL, NULL }, { /* 0x04 - CSIDL_PRINTERS */ + &FOLDERID_PrintersFolder, CSIDL_Type_SystemPath, NULL, NULL }, { /* 0x05 - CSIDL_PERSONAL */ + &GUID_NULL, CSIDL_Type_User, PersonalW, MAKEINTRESOURCEW(IDS_PERSONAL) }, { /* 0x06 - CSIDL_FAVORITES */ + &FOLDERID_Favorites, CSIDL_Type_User, FavoritesW, MAKEINTRESOURCEW(IDS_FAVORITES) }, { /* 0x07 - CSIDL_STARTUP */ + &FOLDERID_Startup, CSIDL_Type_User, StartUpW, MAKEINTRESOURCEW(IDS_STARTUP) }, { /* 0x08 - CSIDL_RECENT */ + &FOLDERID_Recent, CSIDL_Type_User, RecentW, MAKEINTRESOURCEW(IDS_RECENT) }, { /* 0x09 - CSIDL_SENDTO */ + &FOLDERID_SendTo, CSIDL_Type_User, SendToW, MAKEINTRESOURCEW(IDS_SENDTO) }, { /* 0x0a - CSIDL_BITBUCKET - Recycle Bin */ + &FOLDERID_RecycleBinFolder, CSIDL_Type_Disallowed, NULL, NULL, }, { /* 0x0b - CSIDL_STARTMENU */ + &FOLDERID_StartMenu, CSIDL_Type_User, Start_MenuW, MAKEINTRESOURCEW(IDS_STARTMENU) }, { /* 0x0c - CSIDL_MYDOCUMENTS */ + &GUID_NULL, CSIDL_Type_Disallowed, /* matches WinXP--can't get its path */ NULL, NULL }, { /* 0x0d - CSIDL_MYMUSIC */ + &FOLDERID_Music, CSIDL_Type_User, My_MusicW, MAKEINTRESOURCEW(IDS_MYMUSIC) }, { /* 0x0e - CSIDL_MYVIDEO */ + &FOLDERID_Videos, CSIDL_Type_User, My_VideoW, MAKEINTRESOURCEW(IDS_MYVIDEO) }, { /* 0x0f - unassigned */ + &GUID_NULL, CSIDL_Type_Disallowed, NULL, NULL, }, { /* 0x10 - CSIDL_DESKTOPDIRECTORY */ + &FOLDERID_Desktop, CSIDL_Type_User, DesktopW, MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) }, { /* 0x11 - CSIDL_DRIVES */ + &FOLDERID_ComputerFolder, CSIDL_Type_Disallowed, NULL, NULL, }, { /* 0x12 - CSIDL_NETWORK */ + &FOLDERID_NetworkFolder, CSIDL_Type_Disallowed, NULL, NULL, }, { /* 0x13 - CSIDL_NETHOOD */ + &FOLDERID_NetHood, CSIDL_Type_User, NetHoodW, MAKEINTRESOURCEW(IDS_NETHOOD) }, { /* 0x14 - CSIDL_FONTS */ + &FOLDERID_Fonts, CSIDL_Type_WindowsPath, FontsW, FontsW }, { /* 0x15 - CSIDL_TEMPLATES */ + &FOLDERID_Templates, CSIDL_Type_User, TemplatesW, MAKEINTRESOURCEW(IDS_TEMPLATES) }, { /* 0x16 - CSIDL_COMMON_STARTMENU */ + &FOLDERID_CommonStartMenu, CSIDL_Type_AllUsers, Common_Start_MenuW, MAKEINTRESOURCEW(IDS_STARTMENU) }, { /* 0x17 - CSIDL_COMMON_PROGRAMS */ + &FOLDERID_CommonPrograms, CSIDL_Type_AllUsers, Common_ProgramsW, MAKEINTRESOURCEW(IDS_PROGRAMS) }, { /* 0x18 - CSIDL_COMMON_STARTUP */ + &FOLDERID_CommonStartup, CSIDL_Type_AllUsers, Common_StartUpW, MAKEINTRESOURCEW(IDS_STARTUP) }, { /* 0x19 - CSIDL_COMMON_DESKTOPDIRECTORY */ + &FOLDERID_PublicDesktop, CSIDL_Type_AllUsers, Common_DesktopW, MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) }, { /* 0x1a - CSIDL_APPDATA */ + &FOLDERID_RoamingAppData, CSIDL_Type_User, AppDataW, MAKEINTRESOURCEW(IDS_APPDATA) }, { /* 0x1b - CSIDL_PRINTHOOD */ + &FOLDERID_PrintHood, CSIDL_Type_User, PrintHoodW, MAKEINTRESOURCEW(IDS_PRINTHOOD) }, { /* 0x1c - CSIDL_LOCAL_APPDATA */ + &FOLDERID_LocalAppData, CSIDL_Type_User, Local_AppDataW, MAKEINTRESOURCEW(IDS_LOCAL_APPDATA) }, { /* 0x1d - CSIDL_ALTSTARTUP */ + &GUID_NULL, CSIDL_Type_NonExistent, NULL, NULL }, { /* 0x1e - CSIDL_COMMON_ALTSTARTUP */ + &GUID_NULL, CSIDL_Type_NonExistent, NULL, NULL }, { /* 0x1f - CSIDL_COMMON_FAVORITES */ + &FOLDERID_Favorites, CSIDL_Type_AllUsers, Common_FavoritesW, MAKEINTRESOURCEW(IDS_FAVORITES) }, { /* 0x20 - CSIDL_INTERNET_CACHE */ + &FOLDERID_InternetCache, CSIDL_Type_User, CacheW, MAKEINTRESOURCEW(IDS_INTERNET_CACHE) }, { /* 0x21 - CSIDL_COOKIES */ + &FOLDERID_Cookies, CSIDL_Type_User, CookiesW, MAKEINTRESOURCEW(IDS_COOKIES) }, { /* 0x22 - CSIDL_HISTORY */ + &FOLDERID_History, CSIDL_Type_User, HistoryW, MAKEINTRESOURCEW(IDS_HISTORY) }, { /* 0x23 - CSIDL_COMMON_APPDATA */ + &FOLDERID_ProgramData, CSIDL_Type_AllUsers, Common_AppDataW, MAKEINTRESOURCEW(IDS_APPDATA) }, { /* 0x24 - CSIDL_WINDOWS */ + &FOLDERID_Windows, CSIDL_Type_WindowsPath, NULL, NULL }, { /* 0x25 - CSIDL_SYSTEM */ + &FOLDERID_System, CSIDL_Type_SystemPath, NULL, NULL }, { /* 0x26 - CSIDL_PROGRAM_FILES */ + &FOLDERID_ProgramFiles, CSIDL_Type_CurrVer, ProgramFilesDirW, MAKEINTRESOURCEW(IDS_PROGRAM_FILES) }, { /* 0x27 - CSIDL_MYPICTURES */ + &FOLDERID_Pictures, CSIDL_Type_User, My_PicturesW, MAKEINTRESOURCEW(IDS_MYPICTURES) }, { /* 0x28 - CSIDL_PROFILE */ + &FOLDERID_Profile, CSIDL_Type_User, NULL, NULL }, { /* 0x29 - CSIDL_SYSTEMX86 */ + &FOLDERID_SystemX86, CSIDL_Type_SystemX86Path, NULL, NULL }, { /* 0x2a - CSIDL_PROGRAM_FILESX86 */ + &FOLDERID_ProgramFilesX86, CSIDL_Type_CurrVer, ProgramFilesDirX86W, MAKEINTRESOURCEW(IDS_PROGRAM_FILESX86) }, { /* 0x2b - CSIDL_PROGRAM_FILES_COMMON */ + &FOLDERID_ProgramFilesCommon, CSIDL_Type_CurrVer, CommonFilesDirW, MAKEINTRESOURCEW(IDS_PROGRAM_FILES_COMMON) }, { /* 0x2c - CSIDL_PROGRAM_FILES_COMMONX86 */ + &FOLDERID_ProgramFilesCommonX86, CSIDL_Type_CurrVer, CommonFilesDirX86W, MAKEINTRESOURCEW(IDS_PROGRAM_FILES_COMMONX86) }, { /* 0x2d - CSIDL_COMMON_TEMPLATES */ + &FOLDERID_CommonTemplates, CSIDL_Type_AllUsers, Common_TemplatesW, MAKEINTRESOURCEW(IDS_TEMPLATES) }, { /* 0x2e - CSIDL_COMMON_DOCUMENTS */ + &FOLDERID_PublicDocuments, CSIDL_Type_AllUsers, Common_DocumentsW, MAKEINTRESOURCEW(IDS_COMMON_DOCUMENTS) }, { /* 0x2f - CSIDL_COMMON_ADMINTOOLS */ + &FOLDERID_CommonAdminTools, CSIDL_Type_AllUsers, Common_Administrative_ToolsW, MAKEINTRESOURCEW(IDS_ADMINTOOLS) }, { /* 0x30 - CSIDL_ADMINTOOLS */ + &FOLDERID_AdminTools, CSIDL_Type_User, Administrative_ToolsW, MAKEINTRESOURCEW(IDS_ADMINTOOLS) }, { /* 0x31 - CSIDL_CONNECTIONS */ + &FOLDERID_ConnectionsFolder, CSIDL_Type_Disallowed, NULL, NULL }, { /* 0x32 - unassigned */ + &GUID_NULL, CSIDL_Type_Disallowed, NULL, NULL }, { /* 0x33 - unassigned */ + &GUID_NULL, CSIDL_Type_Disallowed, NULL, NULL }, { /* 0x34 - unassigned */ + &GUID_NULL, CSIDL_Type_Disallowed, NULL, NULL }, { /* 0x35 - CSIDL_COMMON_MUSIC */ + &FOLDERID_PublicMusic, CSIDL_Type_AllUsers, CommonMusicW, MAKEINTRESOURCEW(IDS_COMMON_MUSIC) }, { /* 0x36 - CSIDL_COMMON_PICTURES */ + &FOLDERID_PublicPictures, CSIDL_Type_AllUsers, CommonPicturesW, MAKEINTRESOURCEW(IDS_COMMON_PICTURES) }, { /* 0x37 - CSIDL_COMMON_VIDEO */ + &FOLDERID_PublicVideos, CSIDL_Type_AllUsers, CommonVideoW, MAKEINTRESOURCEW(IDS_COMMON_VIDEO) }, { /* 0x38 - CSIDL_RESOURCES */ + &FOLDERID_ResourceDir, CSIDL_Type_WindowsPath, NULL, ResourcesW }, { /* 0x39 - CSIDL_RESOURCES_LOCALIZED */ + &FOLDERID_LocalizedResourcesDir, CSIDL_Type_NonExistent, NULL, NULL }, { /* 0x3a - CSIDL_COMMON_OEM_LINKS */ - CSIDL_Type_NonExistent, + &FOLDERID_CommonOEMLinks, + CSIDL_Type_AllUsers, NULL, - NULL + MAKEINTRESOURCEW(IDS_COMMON_OEM_LINKS) }, { /* 0x3b - CSIDL_CDBURN_AREA */ + &FOLDERID_CDBurning, CSIDL_Type_User, CD_BurningW, MAKEINTRESOURCEW(IDS_CDBURN_AREA) }, { /* 0x3c unassigned */ + &GUID_NULL, CSIDL_Type_Disallowed, NULL, NULL }, { /* 0x3d - CSIDL_COMPUTERSNEARME */ + &GUID_NULL, CSIDL_Type_Disallowed, /* FIXME */ NULL, NULL }, { /* 0x3e - CSIDL_PROFILES */ + &GUID_NULL, CSIDL_Type_Disallowed, /* oddly, this matches WinXP */ NULL, NULL + }, + { /* 0x3f */ + &FOLDERID_AddNewPrograms, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x40 */ + &FOLDERID_AppUpdates, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x41 */ + &FOLDERID_ChangeRemovePrograms, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x42 */ + &FOLDERID_ConflictFolder, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x43 */ + &FOLDERID_Contacts, + CSIDL_Type_User, + ContactsW, + MAKEINTRESOURCEW(IDS_CONTACTS) + }, + { /* 0x44 */ + &FOLDERID_DeviceMetadataStore, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x45 */ + &FOLDERID_Documents, + CSIDL_Type_User, + NULL, + MAKEINTRESOURCEW(IDS_DOCUMENTS) + }, + { /* 0x46 */ + &FOLDERID_DocumentsLibrary, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x47 */ + &FOLDERID_Downloads, + CSIDL_Type_User, + NULL, + MAKEINTRESOURCEW(IDS_DOWNLOADS) + }, + { /* 0x48 */ + &FOLDERID_Games, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x49 */ + &FOLDERID_GameTasks, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x4a */ + &FOLDERID_HomeGroup, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x4b */ + &FOLDERID_ImplicitAppShortcuts, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x4c */ + &FOLDERID_Libraries, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x4d */ + &FOLDERID_Links, + CSIDL_Type_User, + NULL, + MAKEINTRESOURCEW(IDS_LINKS) + }, + { /* 0x4e */ + &FOLDERID_LocalAppDataLow, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x4f */ + &FOLDERID_MusicLibrary, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x50 */ + &FOLDERID_OriginalImages, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x51 */ + &FOLDERID_PhotoAlbums, + CSIDL_Type_User, + NULL, + MAKEINTRESOURCEW(IDS_PHOTO_ALBUMS) + }, + { /* 0x52 */ + &FOLDERID_PicturesLibrary, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x53 */ + &FOLDERID_Playlists, + CSIDL_Type_User, + NULL, + MAKEINTRESOURCEW(IDS_PLAYLISTS) + }, + { /* 0x54 */ + &FOLDERID_ProgramFilesX64, + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x55 */ + &FOLDERID_ProgramFilesCommonX64, + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x56 */ + &FOLDERID_Public, + CSIDL_Type_CurrVer, /* FIXME */ + NULL, + UsersPublicW + }, + { /* 0x57 */ + &FOLDERID_PublicDownloads, + CSIDL_Type_AllUsers, + NULL, + MAKEINTRESOURCEW(IDS_PUBLIC_DOWNLOADS) + }, + { /* 0x58 */ + &FOLDERID_PublicGameTasks, + CSIDL_Type_AllUsers, + NULL, + MAKEINTRESOURCEW(IDS_PUBLIC_GAME_TASKS) + }, + { /* 0x59 */ + &FOLDERID_PublicLibraries, + CSIDL_Type_AllUsers, + NULL, + MAKEINTRESOURCEW(IDS_PUBLIC_LIBRARIES) + }, + { /* 0x5a */ + &FOLDERID_PublicRingtones, + CSIDL_Type_AllUsers, + NULL, + MAKEINTRESOURCEW(IDS_PUBLIC_RINGTONES) + }, + { /* 0x5b */ + &FOLDERID_QuickLaunch, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x5c */ + &FOLDERID_RecordedTVLibrary, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x5d */ + &FOLDERID_Ringtones, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x5e */ + &FOLDERID_SampleMusic, + CSIDL_Type_AllUsers, + NULL, + MAKEINTRESOURCEW(IDS_SAMPLE_MUSIC) + }, + { /* 0x5f */ + &FOLDERID_SamplePictures, + CSIDL_Type_AllUsers, + NULL, + MAKEINTRESOURCEW(IDS_SAMPLE_PICTURES) + }, + { /* 0x60 */ + &FOLDERID_SamplePlaylists, + CSIDL_Type_AllUsers, + NULL, + MAKEINTRESOURCEW(IDS_SAMPLE_PLAYLISTS) + }, + { /* 0x61 */ + &FOLDERID_SampleVideos, + CSIDL_Type_AllUsers, + NULL, + MAKEINTRESOURCEW(IDS_SAMPLE_VIDEOS) + }, + { /* 0x62 */ + &FOLDERID_SavedGames, + CSIDL_Type_User, + NULL, + MAKEINTRESOURCEW(IDS_SAVED_GAMES) + }, + { /* 0x63 */ + &FOLDERID_SavedSearches, + CSIDL_Type_User, + NULL, + MAKEINTRESOURCEW(IDS_SAVED_SEARCHES) + }, + { /* 0x64 */ + &FOLDERID_SEARCH_CSC, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x65 */ + &FOLDERID_SEARCH_MAPI, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x66 */ + &FOLDERID_SearchHome, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x67 */ + &FOLDERID_SidebarDefaultParts, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x68 */ + &FOLDERID_SidebarParts, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x69 */ + &FOLDERID_SyncManagerFolder, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x6a */ + &FOLDERID_SyncResultsFolder, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x6b */ + &FOLDERID_SyncSetupFolder, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x6c */ + &FOLDERID_UserPinned, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x6d */ + &FOLDERID_UserProfiles, + CSIDL_Type_CurrVer, + UsersW, + MAKEINTRESOURCEW(IDS_USER_PROFILES) + }, + { /* 0x6e */ + &FOLDERID_UserProgramFiles, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x6f */ + &FOLDERID_UserProgramFilesCommon, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x70 */ + &FOLDERID_UsersFiles, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x71 */ + &FOLDERID_UsersLibraries, + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x72 */ + &FOLDERID_VideosLibrary, + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL } }; @@ -2506,11 +2887,53 @@ HRESULT WINAPI SHGetSpecialFolderLocation( return hr; } +static int csidl_from_id( const KNOWNFOLDERID *id ) +{ + int i; + for (i = 0; i < sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0]); i++) + if (IsEqualGUID( CSIDL_Data[i].id, id )) return i; + return -1; +} + /************************************************************************* * SHGetKnownFolderPath [SHELL32.@] */ HRESULT WINAPI SHGetKnownFolderPath(REFKNOWNFOLDERID rfid, DWORD flags, HANDLE token, PWSTR *path) { - FIXME("(%s, %d, %p, %p) stub!\n", debugstr_guid(rfid), flags, token, path); - return E_NOTIMPL; + HRESULT hr; + WCHAR folder[MAX_PATH]; + int index = csidl_from_id( rfid ); + + TRACE("%s, 0x%08x, %p, %p\n", debugstr_guid(rfid), flags, token, path); + + if (index < 0) + return E_INVALIDARG; + + if (flags & KF_FLAG_CREATE) + index |= CSIDL_FLAG_CREATE; + + if (flags & KF_FLAG_DONT_VERIFY) + index |= CSIDL_FLAG_DONT_VERIFY; + + if (flags & KF_FLAG_NO_ALIAS) + index |= CSIDL_FLAG_NO_ALIAS; + + if (flags & KF_FLAG_INIT) + index |= CSIDL_FLAG_PER_USER_INIT; + + if (flags & ~(KF_FLAG_CREATE|KF_FLAG_DONT_VERIFY|KF_FLAG_NO_ALIAS|KF_FLAG_INIT)) + { + FIXME("flags 0x%08x not supported\n", flags); + return E_INVALIDARG; + } + + hr = SHGetFolderPathW( NULL, index, token, 0, folder ); + if (SUCCEEDED(hr)) + { + *path = CoTaskMemAlloc( (strlenW( folder ) + 1) * sizeof(WCHAR) ); + if (!*path) + return E_OUTOFMEMORY; + strcpyW( *path, folder ); + } + return hr; } diff --git a/dlls/shell32/shresdef.h b/dlls/shell32/shresdef.h index 9261fe3420c..136201a18b4 100644 --- a/dlls/shell32/shresdef.h +++ b/dlls/shell32/shresdef.h @@ -92,6 +92,25 @@ #define IDS_CDBURN_AREA 71 #define IDS_PROGRAM_FILESX86 72 #define IDS_PROGRAM_FILES_COMMONX86 73 +#define IDS_CONTACTS 74 +#define IDS_LINKS 75 +#define IDS_PHOTO_ALBUMS 76 +#define IDS_PICTURES_LIBRARY 77 +#define IDS_PLAYLISTS 78 +#define IDS_PUBLIC_DOWNLOADS 79 +#define IDS_PUBLIC_GAME_TASKS 84 +#define IDS_PUBLIC_LIBRARIES 85 +#define IDS_PUBLIC_RINGTONES 86 +#define IDS_SAMPLE_MUSIC 87 +#define IDS_SAMPLE_PICTURES 88 +#define IDS_SAMPLE_PLAYLISTS 89 +#define IDS_SAMPLE_VIDEOS 90 +#define IDS_SAVED_GAMES 91 +#define IDS_SAVED_SEARCHES 92 +#define IDS_USER_PROFILES 93 +#define IDS_COMMON_OEM_LINKS 94 +#define IDS_DOCUMENTS 95 +#define IDS_DOWNLOADS 96 #define IDS_CREATEFOLDER_DENIED 128 #define IDS_CREATEFOLDER_CAPTION 129