[PATCH 3/4] shell32: Calculate known folder paths from parent and relative path

Andrew Eikum aeikum at codeweavers.com
Thu May 27 13:38:03 CDT 2021


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---

The actual path changes were in the previous patch. This one just
de-duplicates some static data.

 dlls/shell32/shellpath.c | 249 ++++++++++++++-------------------------
 1 file changed, 89 insertions(+), 160 deletions(-)

diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index b6af8f6f45a..3be759bf616 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -832,21 +832,8 @@ static const WCHAR AppUpdatesFolderW[] = {'A','p','p','U','p','d','a','t','e','s
 static const WCHAR Administrative_ToolsW[] = {'A','d','m','i','n','i','s','t','r','a','t','i','v','e',' ','T','o','o','l','s','\0'};
 static const WCHAR AppDataW[] = {'A','p','p','D','a','t','a','\0'};
 static const WCHAR AppData_RoamingW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\0'};
-static const WCHAR AppData_Roaming_Microsoft_Windows_Network_ShortcutsW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','N','e','t','w','o','r','k',' ','S','h','o','r','t','c','u','t','s',0};
-static const WCHAR AppData_Roaming_Microsoft_Windows_Printer_ShortcutsW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','P','r','i','n','t','e','r',' ','S','h','o','r','t','c','u','t','s',0};
-static const WCHAR AppData_Roaming_Microsoft_Windows_RecentW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','R','e','c','e','n','t',0};
-static const WCHAR AppData_Roaming_Microsoft_Windows_SendToW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','e','n','d','T','o',0};
-static const WCHAR AppData_Roaming_Microsoft_Windows_Start_MenuW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ','M','e','n','u',0};
-static const WCHAR AppData_Roaming_Microsoft_Windows_Start_Menu_ProgramsW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ','M','e','n','u','\\','P','r','o','g','r','a','m','s',0};
-static const WCHAR AppData_Roaming_Microsoft_Windows_Start_Menu_Programs_StartupW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ','M','e','n','u','\\','P','r','o','g','r','a','m','s','\\','S','t','a','r','t','u','p',0};
-static const WCHAR AppData_Roaming_Microsoft_Windows_Start_Menu_Programs_Administrative_ToolsW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ','M','e','n','u','\\','P','r','o','g','r','a','m','s','\\','A','d','m','i','n','i','s','t','r','a','t','i','v','e',' ','T','o','o','l','s',0};
-static const WCHAR AppData_Roaming_Microsoft_Windows_TemplatesW[] = {'A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','T','e','m','p','l','a','t','e','s',0};
 static const WCHAR AppData_LocalLowW[] = {'A','p','p','D','a','t','a','\\','L','o','c','a','l','L','o','w','\0'};
 static const WCHAR AppData_LocalW[] = {'A','p','p','D','a','t','a','\\','L','o','c','a','l','\0'};
-static const WCHAR AppData_Local_Microsoft_Windows_Burn_BurnW[] = {'A','p','p','D','a','t','a','\\','L','o','c','a','l','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','B','u','r','n','\\','B','u','r','n',0};
-static const WCHAR AppData_Local_Microsoft_Windows_HistoryW[] = {'A','p','p','D','a','t','a','\\','L','o','c','a','l','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','H','i','s','t','o','r','y',0};
-static const WCHAR AppData_Local_Microsoft_Windows_INetCacheW[] = {'A','p','p','D','a','t','a','\\','L','o','c','a','l','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','I','N','e','t','C','a','c','h','e',0};
-static const WCHAR AppData_Local_Microsoft_Windows_INetCookiesW[] = {'A','p','p','D','a','t','a','\\','L','o','c','a','l','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','I','N','e','t','C','o','o','k','i','e','s',0};
 static const WCHAR CacheW[] = {'C','a','c','h','e','\0'};
 static const WCHAR CD_BurningW[] = {'C','D',' ','B','u','r','n','i','n','g','\0'};
 static const WCHAR ChangeRemoveProgramsFolderW[] = {'C','h','a','n','g','e','R','e','m','o','v','e','P','r','o','g','r','a','m','s','F','o','l','d','e','r',0};
@@ -912,18 +899,12 @@ static const WCHAR Microsoft_Windows_RingtonesW[] = {'M','i','c','r','o','s','o'
 static const WCHAR Microsoft_Windows_SendToW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','e','n','d','T','o',0};
 static const WCHAR Microsoft_Windows_Sidebar_GadgetsW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s',' ','S','i','d','e','b','a','r','\\','G','a','d','g','e','t','s',0};
 static const WCHAR Microsoft_Windows_Start_MenuW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ','M','e','n','u',0};
-static const WCHAR Microsoft_Windows_Start_Menu_ProgramsW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ','M','e','n','u','\\','P','r','o','g','r','a','m','s','\0'};
-static const WCHAR Microsoft_Windows_Start_Menu_Admin_ToolsW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ','M','e','n','u','\\','P','r','o','g','r','a','m','s','\\','A','d','m','i','n','i','s','t','r','a','t','i','v','e',' ','T','o','o','l','s','\0'};
-static const WCHAR Microsoft_Windows_Start_Menu_StartupW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ','M','e','n','u','\\','P','r','o','g','r','a','m','s','\\','S','t','a','r','t','U','p','\0'};
 static const WCHAR Microsoft_Windows_TemplatesW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','T','e','m','p','l','a','t','e','s',0};
 static const WCHAR Microsoft_Windows_ThemesW[] =  {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','T','h','e','m','e','s',0};
 static const WCHAR MoviesW[] = {'M','o','v','i','e','s','\0'};
 static const WCHAR MusicW[] = {'M','u','s','i','c','\0'};
 static const WCHAR MusicLibraryW[] = {'M','u','s','i','c','L','i','b','r','a','r','y',0};
 static const WCHAR Music_librarymsW[] = {'M','u','s','i','c','.','l','i','b','r','a','r','y','-','m','s',0};
-static const WCHAR Music_PlaylistsW[] = {'M','u','s','i','c','\\','P','l','a','y','l','i','s','t','s','\0'};
-static const WCHAR Music_Sample_MusicW[] = {'M','u','s','i','c','\\','S','a','m','p','l','e',' ','M','u','s','i','c','\0'};
-static const WCHAR Music_Sample_PlaylistsW[] = {'M','u','s','i','c','\\','S','a','m','p','l','e',' ','P','l','a','y','l','i','s','t','s','\0'};
 static const WCHAR My_MusicW[] = {'M','y',' ','M','u','s','i','c','\0'};
 static const WCHAR My_PicturesW[] = {'M','y',' ','P','i','c','t','u','r','e','s','\0'};
 static const WCHAR My_VideosW[] = {'M','y',' ','V','i','d','e','o','s','\0'};
@@ -938,8 +919,6 @@ static const WCHAR PhotoAlbumsW[] = {'P','h','o','t','o','A','l','b','u','m','s'
 static const WCHAR PicturesW[] = {'P','i','c','t','u','r','e','s','\0'};
 static const WCHAR PicturesLibraryW[] = {'P','i','c','t','u','r','e','s','L','i','b','r','a','r','y',0};
 static const WCHAR Pictures_librarymsW[] = {'P','i','c','t','u','r','e','s','.','l','i','b','r','a','r','y','-','m','s',0};
-static const WCHAR Pictures_Sample_PicturesW[] = {'P','i','c','t','u','r','e','s','\\','S','a','m','p','l','e',' ','P','i','c','t','u','r','e','s','\0'};
-static const WCHAR Pictures_Slide_ShowsW[] = {'P','i','c','t','u','r','e','s','\\','S','l','i','d','e',' ','S','h','o','w','s','\0'};
 static const WCHAR PlaylistsW[] = {'P','l','a','y','l','i','s','t','s',0};
 static const WCHAR PrintersFolderW[] = {'P','r','i','n','t','e','r','s','F','o','l','d','e','r',0};
 static const WCHAR PrintHoodW[] = {'P','r','i','n','t','H','o','o','d','\0'};
@@ -1003,7 +982,6 @@ static const WCHAR UsersPublicW[] = {'u','s','e','r','s','\\','P','u','b','l','i
 static const WCHAR VideosW[] = {'V','i','d','e','o','s','\0'};
 static const WCHAR VideosLibraryW[] = {'V','i','d','e','o','s','L','i','b','r','a','r','y',0};
 static const WCHAR Videos_librarymsW[] = {'V','i','d','e','o','s','.','l','i','b','r','a','r','y','-','m','s',0};
-static const WCHAR Videos_Sample_VideosW[] = {'V','i','d','e','o','s','\\','S','a','m','p','l','e',' ','V','i','d','e','o','s','\0'};
 static const WCHAR WindowsW[] = {'W','i','n','d','o','w','s',0};
 static const WCHAR Windows_Sidebar_GadgetsW[] = {'W','i','n','d','o','w','s',' ','S','i','d','e','b','a','r','\\','G','a','d','g','e','t','s',0};
 static const WCHAR DefaultW[] = {'.','D','e','f','a','u','l','t','\0'};
@@ -1229,7 +1207,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Desktop,
         CSIDL_Type_User,
         DesktopW,
-        MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY),
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         DesktopW, /* name */
@@ -1269,7 +1247,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Programs,
         CSIDL_Type_User,
         ProgramsW,
-        AppData_Roaming_Microsoft_Windows_Start_Menu_ProgramsW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         ProgramsW, /* name */
@@ -1329,7 +1307,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Documents,
         CSIDL_Type_User,
         PersonalW,
-        MAKEINTRESOURCEW(IDS_PERSONAL),
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         PersonalW, /* name */
@@ -1349,7 +1327,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Favorites,
         CSIDL_Type_User,
         FavoritesW,
-        FavoritesW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         FavoritesW, /* name */
@@ -1369,7 +1347,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Startup,
         CSIDL_Type_User,
         StartUpW,
-        AppData_Roaming_Microsoft_Windows_Start_Menu_Programs_StartupW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         StartupW, /* name */
@@ -1389,7 +1367,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Recent,
         CSIDL_Type_User,
         RecentW,
-        AppData_Roaming_Microsoft_Windows_RecentW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         RecentW, /* name */
@@ -1409,7 +1387,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_SendTo,
         CSIDL_Type_User,
         SendToW,
-        AppData_Roaming_Microsoft_Windows_SendToW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         SendToW, /* name */
@@ -1449,7 +1427,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_StartMenu,
         CSIDL_Type_User,
         Start_MenuW,
-        AppData_Roaming_Microsoft_Windows_Start_MenuW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         Start_MenuW, /* name */
@@ -1475,7 +1453,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Music,
         CSIDL_Type_User,
         My_MusicW,
-        MAKEINTRESOURCEW(IDS_MYMUSIC),
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         My_MusicW, /* name */
@@ -1495,7 +1473,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Videos,
         CSIDL_Type_User,
         My_VideosW,
-        MAKEINTRESOURCEW(IDS_MYVIDEOS),
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         My_VideoW, /* name */
@@ -1521,7 +1499,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Desktop,
         CSIDL_Type_User,
         DesktopW,
-        MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY),
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         DesktopW, /* name */
@@ -1581,7 +1559,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_NetHood,
         CSIDL_Type_User,
         NetHoodW,
-        AppData_Roaming_Microsoft_Windows_Network_ShortcutsW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         NetHoodW, /* name */
@@ -1621,7 +1599,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Templates,
         CSIDL_Type_User,
         TemplatesW,
-        AppData_Roaming_Microsoft_Windows_TemplatesW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         TemplatesW, /* name */
@@ -1641,7 +1619,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_CommonStartMenu,
         CSIDL_Type_ProgramData,
         Common_Start_MenuW,
-        Microsoft_Windows_Start_MenuW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         Common_Start_MenuW, /* name */
@@ -1661,7 +1639,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_CommonPrograms,
         CSIDL_Type_ProgramData,
         Common_ProgramsW,
-        Microsoft_Windows_Start_Menu_ProgramsW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         Common_ProgramsW, /* name */
@@ -1681,7 +1659,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_CommonStartup,
         CSIDL_Type_ProgramData,
         Common_StartUpW,
-        Microsoft_Windows_Start_Menu_StartupW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         Common_StartupW, /* name */
@@ -1701,7 +1679,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicDesktop,
         CSIDL_Type_AllUsers,
         Common_DesktopW,
-        MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY),
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         Common_DesktopW, /* name */
@@ -1721,7 +1699,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_RoamingAppData,
         CSIDL_Type_User,
         AppDataW,
-        AppData_RoamingW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         AppDataW, /* name */
@@ -1741,7 +1719,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PrintHood,
         CSIDL_Type_User,
         PrintHoodW,
-        AppData_Roaming_Microsoft_Windows_Printer_ShortcutsW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         PrintHoodW, /* name */
@@ -1761,7 +1739,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_LocalAppData,
         CSIDL_Type_User,
         Local_AppDataW,
-        AppData_LocalW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         Local_AppDataW, /* name */
@@ -1793,7 +1771,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Favorites,
         CSIDL_Type_AllUsers,
         Common_FavoritesW,
-        FavoritesW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         FavoritesW, /* name */
@@ -1813,7 +1791,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_InternetCache,
         CSIDL_Type_User,
         CacheW,
-        AppData_Local_Microsoft_Windows_INetCacheW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         CacheW, /* name */
@@ -1833,7 +1811,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Cookies,
         CSIDL_Type_User,
         CookiesW,
-        AppData_Local_Microsoft_Windows_INetCookiesW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         CookiesW, /* name */
@@ -1853,7 +1831,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_History,
         CSIDL_Type_User,
         HistoryW,
-        AppData_Local_Microsoft_Windows_HistoryW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         HistoryW, /* name */
@@ -1953,7 +1931,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Pictures,
         CSIDL_Type_User,
         My_PicturesW,
-        MAKEINTRESOURCEW(IDS_MYPICTURES),
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         My_PicturesW, /* name */
@@ -2073,7 +2051,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_CommonTemplates,
         CSIDL_Type_ProgramData,
         Common_TemplatesW,
-        Microsoft_Windows_TemplatesW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         Common_TemplatesW, /* name */
@@ -2093,7 +2071,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicDocuments,
         CSIDL_Type_AllUsers,
         Common_DocumentsW,
-        DocumentsW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         Common_DocumentsW, /* name */
@@ -2113,7 +2091,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_CommonAdminTools,
         CSIDL_Type_ProgramData,
         Common_Administrative_ToolsW,
-        Microsoft_Windows_Start_Menu_Admin_ToolsW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         Common_Administrative_ToolsW, /* name */
@@ -2133,7 +2111,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_AdminTools,
         CSIDL_Type_User,
         Administrative_ToolsW,
-        AppData_Roaming_Microsoft_Windows_Start_Menu_Programs_Administrative_ToolsW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         Administrative_ToolsW, /* name */
@@ -2191,7 +2169,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicMusic,
         CSIDL_Type_AllUsers,
         CommonMusicW,
-        MusicW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         CommonMusicW, /* name */
@@ -2211,7 +2189,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicPictures,
         CSIDL_Type_AllUsers,
         CommonPicturesW,
-        PicturesW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         CommonPicturesW, /* name */
@@ -2231,7 +2209,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicVideos,
         CSIDL_Type_AllUsers,
         CommonVideoW,
-        VideosW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         CommonVideoW, /* name */
@@ -2291,7 +2269,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_CommonOEMLinks,
         CSIDL_Type_ProgramData,
         NULL,
-        OEM_LinksW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         OEM_LinksW, /* name */
@@ -2311,7 +2289,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_CDBurning,
         CSIDL_Type_User,
         CD_BurningW,
-        AppData_Local_Microsoft_Windows_Burn_BurnW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         CD_BurningW, /* name */
@@ -2429,7 +2407,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Contacts,
         CSIDL_Type_User,
         NULL,
-        ContactsW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         ContactsW, /* name */
@@ -2495,7 +2473,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Downloads,
         CSIDL_Type_User,
         NULL,
-        DownloadsW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         DownloadsW, /* name */
@@ -2615,7 +2593,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Links,
         CSIDL_Type_User,
         NULL,
-        LinksW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         LinksW, /* name */
@@ -2635,7 +2613,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_LocalAppDataLow,
         CSIDL_Type_User,
         NULL,
-        AppData_LocalLowW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         LocalAppDataLowW, /* name */
@@ -2695,7 +2673,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PhotoAlbums,
         CSIDL_Type_User,
         NULL,
-        Pictures_Slide_ShowsW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         PhotoAlbumsW, /* name */
@@ -2735,7 +2713,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_Playlists,
         CSIDL_Type_User,
         NULL,
-        Music_PlaylistsW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         PlaylistsW, /* name */
@@ -2827,7 +2805,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicDownloads,
         CSIDL_Type_AllUsers,
         NULL,
-        DownloadsW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         CommonDownloadsW, /* name */
@@ -2847,7 +2825,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicGameTasks,
         CSIDL_Type_ProgramData,
         NULL,
-        Microsoft_Windows_GameExplorerW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         PublicGameTasksW, /* name */
@@ -2867,7 +2845,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicLibraries,
         CSIDL_Type_AllUsers,
         NULL,
-        Microsoft_Windows_LibrariesW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         PublicLibrariesW, /* name */
@@ -2887,7 +2865,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_PublicRingtones,
         CSIDL_Type_ProgramData,
         NULL,
-        Microsoft_Windows_RingtonesW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         CommonRingtonesW, /* name */
@@ -2967,7 +2945,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_SampleMusic,
         CSIDL_Type_AllUsers,
         NULL,
-        Music_Sample_MusicW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         SampleMusicW, /* name */
@@ -2987,7 +2965,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_SamplePictures,
         CSIDL_Type_AllUsers,
         NULL,
-        Pictures_Sample_PicturesW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         SamplePicturesW, /* name */
@@ -3007,7 +2985,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_SamplePlaylists,
         CSIDL_Type_AllUsers,
         NULL,
-        Music_Sample_PlaylistsW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         SamplePlaylistsW, /* name */
@@ -3027,7 +3005,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_SampleVideos,
         CSIDL_Type_AllUsers,
         NULL,
-        Videos_Sample_VideosW,
+        NULL,
 
         KF_CATEGORY_COMMON, /* category */
         SampleVideosW, /* name */
@@ -3047,7 +3025,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_SavedGames,
         CSIDL_Type_User,
         NULL,
-        Saved_GamesW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         SavedGamesW, /* name */
@@ -3067,7 +3045,7 @@ static const CSIDL_DATA CSIDL_Data[] =
         &FOLDERID_SavedSearches,
         CSIDL_Type_User,
         NULL,
-        SearchesW,
+        NULL,
 
         KF_CATEGORY_PERUSER, /* category */
         SearchesW, /* name */
@@ -3385,6 +3363,14 @@ static const CSIDL_DATA CSIDL_Data[] =
     }
 };
 
+static int csidl_from_id( const KNOWNFOLDERID *id )
+{
+    int i;
+    for (i = 0; i < ARRAY_SIZE(CSIDL_Data); i++)
+        if (IsEqualGUID( CSIDL_Data[i].id, id )) return i;
+    return -1;
+}
+
 static HRESULT _SHExpandEnvironmentStrings(LPCWSTR szSrc, LPWSTR szDest);
 
 /* Gets the value named value from the registry key
@@ -3467,11 +3453,22 @@ static HRESULT _SHGetUserShellFolderPath(HKEY rootKey, LPCWSTR userPrefix,
     return hr;
 }
 
+static void append_relative_path(BYTE folder, WCHAR *pszPath)
+{
+    if (CSIDL_Data[folder].pszRelativePath)
+    {
+        PathAddBackslashW(pszPath);
+        strcatW(pszPath, CSIDL_Data[folder].pszRelativePath);
+    }
+    else if (CSIDL_Data[folder].szDefaultPath)
+    {
+        PathAddBackslashW(pszPath);
+        strcatW(pszPath, CSIDL_Data[folder].szDefaultPath);
+    }
+}
+
 /* Gets a 'semi-expanded' default value of the CSIDL with index folder into
  * pszPath, based on the entries in CSIDL_Data.  By semi-expanded, I mean:
- * - The entry's szDefaultPath may be either a string value or an integer
- *   resource identifier.  In the latter case, the string value of the resource
- *   is written.
  * - Depending on the entry's type, the path may begin with an (unexpanded)
  *   environment variable name.  The caller is responsible for expanding
  *   environment strings if so desired.
@@ -3484,8 +3481,6 @@ static HRESULT _SHGetUserShellFolderPath(HKEY rootKey, LPCWSTR userPrefix,
 static HRESULT _SHGetDefaultValue(BYTE folder, LPWSTR pszPath)
 {
     HRESULT hr;
-    WCHAR resourcePath[MAX_PATH];
-    LPCWSTR pDefaultPath = NULL;
 
     TRACE("0x%02x,%p\n", folder, pszPath);
 
@@ -3514,29 +3509,9 @@ static HRESULT _SHGetDefaultValue(BYTE folder, LPWSTR pszPath)
         }
     }
 
-    if (CSIDL_Data[folder].szDefaultPath &&
-     IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath))
-    {
-        if (LoadStringW(shell32_hInstance,
-         LOWORD(CSIDL_Data[folder].szDefaultPath), resourcePath, MAX_PATH))
-        {
-            hr = S_OK;
-            pDefaultPath = resourcePath;
-        }
-        else
-        {
-            FIXME("(%d,%s), LoadString failed, missing translation?\n", folder,
-             debugstr_w(pszPath));
-            hr = E_FAIL;
-        }
-    }
-    else
-    {
-        hr = S_OK;
-        pDefaultPath = CSIDL_Data[folder].szDefaultPath;
-    }
-    if (SUCCEEDED(hr))
+    if (IsEqualGUID(CSIDL_Data[folder].fidParent, &GUID_NULL))
     {
+        /* hit the root, sub in env var */
         switch (CSIDL_Data[folder].type)
         {
             case CSIDL_Type_User:
@@ -3554,12 +3529,15 @@ static HRESULT _SHGetDefaultValue(BYTE folder, LPWSTR pszPath)
             default:
                 ; /* no corresponding env. var, do nothing */
         }
-        if (pDefaultPath)
-        {
-            PathAddBackslashW(pszPath);
-            strcatW(pszPath, pDefaultPath);
-        }
+        hr = S_OK;
+    }else{
+        /* prepend with parent */
+        hr = _SHGetDefaultValue(csidl_from_id(CSIDL_Data[folder].fidParent), pszPath);
     }
+
+    if (SUCCEEDED(hr))
+        append_relative_path(folder, pszPath);
+
     TRACE("returning 0x%08x\n", hr);
     return hr;
 }
@@ -4519,35 +4497,17 @@ HRESULT WINAPI SHGetFolderPathAndSubDirW(
             break;
         case CSIDL_Type_WindowsPath:
             GetWindowsDirectoryW(szTemp, MAX_PATH);
-            if (CSIDL_Data[folder].szDefaultPath &&
-             !IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath) &&
-             *CSIDL_Data[folder].szDefaultPath)
-            {
-                PathAddBackslashW(szTemp);
-                strcatW(szTemp, CSIDL_Data[folder].szDefaultPath);
-            }
+            append_relative_path(folder, szTemp);
             hr = S_OK;
             break;
         case CSIDL_Type_SystemPath:
             GetSystemDirectoryW(szTemp, MAX_PATH);
-            if (CSIDL_Data[folder].szDefaultPath &&
-             !IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath) &&
-             *CSIDL_Data[folder].szDefaultPath)
-            {
-                PathAddBackslashW(szTemp);
-                strcatW(szTemp, CSIDL_Data[folder].szDefaultPath);
-            }
+            append_relative_path(folder, szTemp);
             hr = S_OK;
             break;
         case CSIDL_Type_SystemX86Path:
             if (!GetSystemWow64DirectoryW(szTemp, MAX_PATH)) GetSystemDirectoryW(szTemp, MAX_PATH);
-            if (CSIDL_Data[folder].szDefaultPath &&
-             !IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath) &&
-             *CSIDL_Data[folder].szDefaultPath)
-            {
-                PathAddBackslashW(szTemp);
-                strcatW(szTemp, CSIDL_Data[folder].szDefaultPath);
-            }
+            append_relative_path(folder, szTemp);
             hr = S_OK;
             break;
         case CSIDL_Type_CurrVer:
@@ -4707,12 +4667,7 @@ static HRESULT _SHRegisterFolders(HKEY hRootKey, HANDLE hToken,
             else if (CSIDL_Data[folders[i]].type == CSIDL_Type_WindowsPath)
             {
                 GetWindowsDirectoryW(path, MAX_PATH);
-                if (CSIDL_Data[folders[i]].szDefaultPath &&
-                    !IS_INTRESOURCE(CSIDL_Data[folders[i]].szDefaultPath))
-                {
-                    PathAddBackslashW(path);
-                    strcatW(path, CSIDL_Data[folders[i]].szDefaultPath);
-                }
+                append_relative_path(folders[i], path);
             }
             else
                 hr = E_FAIL;
@@ -5118,14 +5073,6 @@ HRESULT WINAPI SHGetSpecialFolderLocation(
     return hr;
 }
 
-static int csidl_from_id( const KNOWNFOLDERID *id )
-{
-    int i;
-    for (i = 0; i < ARRAY_SIZE(CSIDL_Data); i++)
-        if (IsEqualGUID( CSIDL_Data[i].id, id )) return i;
-    return -1;
-}
-
 /*************************************************************************
  * SHGetKnownFolderPath           [SHELL32.@]
  */
@@ -5165,35 +5112,17 @@ HRESULT WINAPI SHGetKnownFolderPath(REFKNOWNFOLDERID rfid, DWORD flags, HANDLE t
             break;
         case CSIDL_Type_WindowsPath:
             GetWindowsDirectoryW(tempW, MAX_PATH);
-            if (CSIDL_Data[folder].szDefaultPath &&
-             !IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath) &&
-             *CSIDL_Data[folder].szDefaultPath)
-            {
-                PathAddBackslashW(tempW);
-                strcatW(tempW, CSIDL_Data[folder].szDefaultPath);
-            }
+            append_relative_path(folder, tempW);
             hr = S_OK;
             break;
         case CSIDL_Type_SystemPath:
             GetSystemDirectoryW(tempW, MAX_PATH);
-            if (CSIDL_Data[folder].szDefaultPath &&
-             !IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath) &&
-             *CSIDL_Data[folder].szDefaultPath)
-            {
-                PathAddBackslashW(tempW);
-                strcatW(tempW, CSIDL_Data[folder].szDefaultPath);
-            }
+            append_relative_path(folder, tempW);
             hr = S_OK;
             break;
         case CSIDL_Type_SystemX86Path:
             if (!GetSystemWow64DirectoryW(tempW, MAX_PATH)) GetSystemDirectoryW(tempW, MAX_PATH);
-            if (CSIDL_Data[folder].szDefaultPath &&
-             !IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath) &&
-             *CSIDL_Data[folder].szDefaultPath)
-            {
-                PathAddBackslashW(tempW);
-                strcatW(tempW, CSIDL_Data[folder].szDefaultPath);
-            }
+            append_relative_path(folder, tempW);
             hr = S_OK;
             break;
         case CSIDL_Type_CurrVer:
-- 
2.31.1





More information about the wine-devel mailing list