[3/4] shell32: Implement SHGetKnownFolderPath.
Hans Leidekker
hans at codeweavers.com
Tue Sep 14 10:01:14 CDT 2010
---
dlls/shell32/shell32_En.rc | 18 ++
dlls/shell32/shellpath.c | 431 +++++++++++++++++++++++++++++++++++++++++++-
dlls/shell32/shresdef.h | 19 ++
3 files changed, 464 insertions(+), 4 deletions(-)
diff --git a/dlls/shell32/shell32_En.rc b/dlls/shell32/shell32_En.rc
index ce7d63d..6fb4c6c 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 8daa875..0eafdc1 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 9261fe3..136201a 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
--
1.7.0.4
More information about the wine-patches
mailing list