[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