From 12d057c8e72281917f263135266eec1f330519f6 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Tue, 17 Mar 2015 10:03:23 -0500 Subject: [PATCH] shell32: Install knownfolders to registry during DLL registration. --- dlls/shell32/shellpath.c | 258 ++++++++++++++++++++++++++++----- dlls/shell32/tests/shellpath.c | 210 +++++++++++++-------------- 2 files changed, 322 insertions(+), 146 deletions(-) diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index f43b0ed6142..aaa27d8071f 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -812,6 +812,7 @@ static const WCHAR Local_Settings_Temporary_Internet_FilesW[] = {'L','o','c','a' static const WCHAR Microsoft_Windows_GameExplorerW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','G','a','m','e','E','x','p','l','o','r','e','r','\0'}; static const WCHAR Microsoft_Windows_LibrariesW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','L','i','b','r','a','r','i','e','s','\0'}; static const WCHAR Microsoft_Windows_RingtonesW[] = {'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','R','i','n','g','t','o','n','e','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 MusicW[] = {'M','u','s','i','c','\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'}; @@ -827,9 +828,11 @@ static const WCHAR Pictures_Sample_PicturesW[] = {'P','i','c','t','u','r','e','s 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 PrintHoodW[] = {'P','r','i','n','t','H','o','o','d','\0'}; static const WCHAR Program_FilesW[] = {'P','r','o','g','r','a','m',' ','F','i','l','e','s','\0'}; +static const WCHAR ProgramFilesW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','\0'}; static const WCHAR Program_Files_Common_FilesW[] = {'P','r','o','g','r','a','m',' ','F','i','l','e','s','\\','C','o','m','m','o','n',' ','F','i','l','e','s','\0'}; static const WCHAR Program_Files_x86W[] = {'P','r','o','g','r','a','m',' ','F','i','l','e','s',' ','(','x','8','6',')','\0'}; static const WCHAR Program_Files_x86_Common_FilesW[] = {'P','r','o','g','r','a','m',' ','F','i','l','e','s',' ','(','x','8','6',')','\\','C','o','m','m','o','n',' ','F','i','l','e','s','\0'}; +static const WCHAR ProgramFilesCommonW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','C','o','m','m','o','n',0}; static const WCHAR ProgramFilesDirW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r','\0'}; static const WCHAR ProgramFilesDirX86W[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r',' ','(','x','8','6',')','\0'}; static const WCHAR ProgramsW[] = {'P','r','o','g','r','a','m','s','\0'}; @@ -843,11 +846,13 @@ static const WCHAR Start_MenuW[] = {'S','t','a','r','t',' ','M','e','n','u','\0' static const WCHAR Start_Menu_ProgramsW[] = {'S','t','a','r','t',' ','M','e','n','u','\\','P','r','o','g','r','a','m','s','\0'}; static const WCHAR Start_Menu_Admin_ToolsW[] = {'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 Start_Menu_StartupW[] = {'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 SystemW[] = {'S','y','s','t','e','m',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 VideosW[] = {'V','i','d','e','o','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 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'}; @@ -886,6 +891,21 @@ typedef struct CSIDL_Type type; LPCWSTR szValueName; LPCWSTR szDefaultPath; /* fallback string or resource ID */ + + /* KNOWNFOLDER_DEFINITION fields */ + KF_CATEGORY category; + const WCHAR *pszName; + const WCHAR *pszDescription; + const KNOWNFOLDERID *fidParent; + const WCHAR *pszRelativePath; + const WCHAR *pszParsingName; + const WCHAR *pszTooltip; + const WCHAR *pszLocalizedName; + const WCHAR *pszIcon; + const WCHAR *pszSecurity; + DWORD dwAttributes; + KF_DEFINITION_FLAGS kfdFlags; + const FOLDERTYPEID *ftidType; } CSIDL_DATA; static const CSIDL_DATA CSIDL_Data[] = @@ -894,7 +914,21 @@ static const CSIDL_DATA CSIDL_Data[] = &FOLDERID_Desktop, CSIDL_Type_User, DesktopW, - MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) + MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY), + + KF_CATEGORY_PERUSER, /* category */ + DesktopW, /* name */ + NULL, /* description */ + &GUID_NULL, /* parent */ + DesktopW, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + FILE_ATTRIBUTE_READONLY, /* attributes */ + 0, /* flags */ + &GUID_NULL /* typeid */ }, { /* 0x01 - CSIDL_INTERNET */ &FOLDERID_InternetFolder, @@ -1014,7 +1048,21 @@ static const CSIDL_DATA CSIDL_Data[] = &FOLDERID_Fonts, CSIDL_Type_WindowsPath, FontsW, - FontsW + FontsW, + + KF_CATEGORY_FIXED, /* category */ + FontsW, /* name */ + NULL, /* description */ + &GUID_NULL, /* parent */ + NULL, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + 0, /* attributes */ + 0, /* flags */ + &FOLDERID_Windows/* typeid */ }, { /* 0x15 - CSIDL_TEMPLATES */ &FOLDERID_Templates, @@ -1026,13 +1074,41 @@ static const CSIDL_DATA CSIDL_Data[] = &FOLDERID_CommonStartMenu, CSIDL_Type_AllUsers, Common_Start_MenuW, - Start_MenuW + Start_MenuW, + + KF_CATEGORY_COMMON, /* category */ + Common_Start_MenuW, /* name */ + NULL, /* description */ + &FOLDERID_ProgramData, /* parent */ + Microsoft_Windows_Start_MenuW, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + FILE_ATTRIBUTE_READONLY, /* attributes */ + 0, /* flags */ + &GUID_NULL /* typeid */ }, { /* 0x17 - CSIDL_COMMON_PROGRAMS */ &FOLDERID_CommonPrograms, CSIDL_Type_AllUsers, Common_ProgramsW, - Start_Menu_ProgramsW + Start_Menu_ProgramsW, + + KF_CATEGORY_COMMON, /* category */ + Common_ProgramsW, /* name */ + NULL, /* description */ + &FOLDERID_CommonStartMenu, /* parent */ + ProgramsW, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + FILE_ATTRIBUTE_READONLY, /* attributes */ + 0, /* flags */ + &GUID_NULL /* typeid */ }, { /* 0x18 - CSIDL_COMMON_STARTUP */ &FOLDERID_CommonStartup, @@ -1104,25 +1180,81 @@ static const CSIDL_DATA CSIDL_Data[] = &FOLDERID_ProgramData, CSIDL_Type_AllUsers, Common_AppDataW, - Application_DataW + Application_DataW, + + KF_CATEGORY_FIXED, /* category */ + Common_AppDataW, /* name */ + NULL, /* description */ + &GUID_NULL, /* parent */ + NULL, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + 0, /* attributes */ + 0, /* flags */ + &GUID_NULL /* typeid */ }, { /* 0x24 - CSIDL_WINDOWS */ &FOLDERID_Windows, CSIDL_Type_WindowsPath, NULL, - NULL + NULL, + + KF_CATEGORY_FIXED, /* category */ + WindowsW, /* name */ + NULL, /* description */ + &GUID_NULL, /* parent */ + NULL, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + 0, /* attributes */ + 0, /* flags */ + &GUID_NULL /* typeid */ }, { /* 0x25 - CSIDL_SYSTEM */ &FOLDERID_System, CSIDL_Type_SystemPath, NULL, - NULL + NULL, + + KF_CATEGORY_FIXED, /* category */ + SystemW, /* name */ + NULL, /* description */ + &GUID_NULL, /* parent */ + NULL, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + 0, /* attributes */ + 0, /* flags */ + &GUID_NULL /* typeid */ }, { /* 0x26 - CSIDL_PROGRAM_FILES */ &FOLDERID_ProgramFiles, CSIDL_Type_CurrVer, ProgramFilesDirW, - Program_FilesW + Program_FilesW, + + KF_CATEGORY_FIXED, /* category */ + ProgramFilesW, /* name */ + NULL, /* description */ + &GUID_NULL, /* parent */ + NULL, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + FILE_ATTRIBUTE_READONLY, /* attributes */ + 0, /* flags */ + &GUID_NULL /* typeid */ }, { /* 0x27 - CSIDL_MYPICTURES */ &FOLDERID_Pictures, @@ -1152,7 +1284,21 @@ static const CSIDL_DATA CSIDL_Data[] = &FOLDERID_ProgramFilesCommon, CSIDL_Type_CurrVer, CommonFilesDirW, - Program_Files_Common_FilesW + Program_Files_Common_FilesW, + + KF_CATEGORY_FIXED, /* category */ + ProgramFilesCommonW, /* name */ + NULL, /* description */ + &GUID_NULL, /* parent */ + NULL, /* relative path */ + NULL, /* parsing */ + NULL, /* tooltip */ + NULL, /* localized */ + NULL, /* icon */ + NULL, /* security */ + 0, /* attributes */ + 0, /* flags */ + &GUID_NULL /* typeid */ }, { /* 0x2c - CSIDL_PROGRAM_FILES_COMMONX86 */ &FOLDERID_ProgramFilesCommonX86, @@ -2879,32 +3025,6 @@ static HRESULT set_folder_attributes(void) return S_OK; } - -/* Register the default values in the registry, as some apps seem to depend - * on their presence. The set registered was taken from Windows XP. - */ -HRESULT SHELL_RegisterShellFolders(void) -{ - HRESULT hr; - - /* Set up '$HOME' targeted symlinks for 'My Documents', 'My Pictures', - * 'My Videos', 'My Music' and 'Desktop' in advance, so that the - * _SHRegister*ShellFolders() functions will find everything nice and clean - * and thus will not attempt to create them in the profile directory. */ - _SHCreateSymbolicLinks(); - - hr = _SHRegisterUserShellFolders(TRUE); - if (SUCCEEDED(hr)) - hr = _SHRegisterUserShellFolders(FALSE); - if (SUCCEEDED(hr)) - hr = _SHRegisterCommonShellFolders(); - if (SUCCEEDED(hr)) - hr = create_extra_folders(); - if (SUCCEEDED(hr)) - hr = set_folder_attributes(); - return hr; -} - /************************************************************************* * SHGetSpecialFolderPathA [SHELL32.@] */ @@ -3912,16 +4032,12 @@ static HRESULT WINAPI foldermanager_GetFolderByName( return E_NOTIMPL; } -static HRESULT WINAPI foldermanager_RegisterFolder( - IKnownFolderManager *iface, - REFKNOWNFOLDERID rfid, - KNOWNFOLDER_DEFINITION const *pKFD) +static HRESULT register_folder(const KNOWNFOLDERID *rfid, const KNOWNFOLDER_DEFINITION *pKFD) { HRESULT hr; HKEY hKey = NULL; DWORD dwDisp; LPWSTR registryPath = NULL; - TRACE("(%p, %s, %p)\n", iface, debugstr_guid(rfid), pKFD); hr = get_known_folder_registry_path(rfid, NULL, ®istryPath); TRACE("registry path: %s\n", debugstr_w(registryPath)); @@ -3965,6 +4081,15 @@ static HRESULT WINAPI foldermanager_RegisterFolder( return hr; } +static HRESULT WINAPI foldermanager_RegisterFolder( + IKnownFolderManager *iface, + REFKNOWNFOLDERID rfid, + KNOWNFOLDER_DEFINITION const *pKFD) +{ + TRACE("(%p, %s, %p)\n", iface, debugstr_guid(rfid), pKFD); + return register_folder(rfid, pKFD); +} + static HRESULT WINAPI foldermanager_UnregisterFolder( IKnownFolderManager *iface, REFKNOWNFOLDERID rfid) @@ -4085,3 +4210,56 @@ HRESULT WINAPI SHGetKnownFolderIDList(REFKNOWNFOLDERID rfid, DWORD flags, HANDLE FIXME("%s, 0x%08x, %p, %p\n", debugstr_guid(rfid), flags, token, pidl); return E_NOTIMPL; } + +static void register_system_knownfolders(void) +{ + int i; + for(i = 0; i < sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0]); ++i){ + const CSIDL_DATA *folder = &CSIDL_Data[i]; + if(folder->pszName){ + KNOWNFOLDER_DEFINITION kfd; + + /* register_folder won't modify kfd, so cast away const instead of + * reallocating */ + kfd.category = folder->category; + kfd.pszName = (WCHAR*)folder->pszName; + kfd.pszDescription = (WCHAR*)folder->pszDescription; + memcpy(&kfd.fidParent, folder->fidParent, sizeof(KNOWNFOLDERID)); + kfd.pszRelativePath = (WCHAR*)folder->pszRelativePath; + kfd.pszParsingName = (WCHAR*)folder->pszParsingName; + kfd.pszTooltip = (WCHAR*)folder->pszTooltip; + kfd.pszLocalizedName = (WCHAR*)folder->pszLocalizedName; + kfd.pszIcon = (WCHAR*)folder->pszIcon; + kfd.pszSecurity = (WCHAR*)folder->pszSecurity; + kfd.dwAttributes = folder->dwAttributes; + kfd.kfdFlags = folder->kfdFlags; + memcpy(&kfd.ftidType, folder->ftidType, sizeof(FOLDERTYPEID)); + + register_folder(folder->id, &kfd); + } + } +} + +HRESULT SHELL_RegisterShellFolders(void) +{ + HRESULT hr; + + /* Set up '$HOME' targeted symlinks for 'My Documents', 'My Pictures', + * 'My Videos', 'My Music' and 'Desktop' in advance, so that the + * _SHRegister*ShellFolders() functions will find everything nice and clean + * and thus will not attempt to create them in the profile directory. */ + _SHCreateSymbolicLinks(); + + hr = _SHRegisterUserShellFolders(TRUE); + if (SUCCEEDED(hr)) + hr = _SHRegisterUserShellFolders(FALSE); + if (SUCCEEDED(hr)) + hr = _SHRegisterCommonShellFolders(); + if (SUCCEEDED(hr)) + hr = create_extra_folders(); + if (SUCCEEDED(hr)) + hr = set_folder_attributes(); + if (SUCCEEDED(hr)) + register_system_knownfolders(); + return hr; +} diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c index 7b042387d74..8c918be2fe9 100644 --- a/dlls/shell32/tests/shellpath.c +++ b/dlls/shell32/tests/shellpath.c @@ -888,6 +888,7 @@ if (0) { /* crashes */ /* Standard CSIDL values (and their flags) uses only two less-significant bytes */ #define NO_CSIDL 0x10000 #define WINE_ATTRIBUTES_OPTIONAL 0x20000 +#define KFD_TODO_WINE 0x40000 #define KNOWN_FOLDER(id, csidl, name, category, parent1, parent2, relative_path, parsing_name, attributes, definitionFlags) \ { &id, # id, csidl, # csidl, name, category, {&parent1, &parent2}, relative_path, parsing_name, attributes, definitionFlags, __LINE__ } @@ -923,7 +924,7 @@ struct knownFolderDef { */ static const struct knownFolderDef known_folders[] = { KNOWN_FOLDER(FOLDERID_AddNewPrograms, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "AddNewProgramsFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -933,7 +934,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_AdminTools, - CSIDL_ADMINTOOLS, + CSIDL_ADMINTOOLS|KFD_TODO_WINE, "Administrative Tools", KF_CATEGORY_PERUSER, FOLDERID_Programs, GUID_NULL, @@ -942,7 +943,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_AppUpdates, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "AppUpdatesFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -952,7 +953,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_CDBurning, - CSIDL_CDBURN_AREA, + CSIDL_CDBURN_AREA|KFD_TODO_WINE, "CD Burning", KF_CATEGORY_PERUSER, FOLDERID_LocalAppData, GUID_NULL, @@ -961,7 +962,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_LOCAL_REDIRECT_ONLY), KNOWN_FOLDER(FOLDERID_ChangeRemovePrograms, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "ChangeRemoveProgramsFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -971,7 +972,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_CommonAdminTools, - CSIDL_COMMON_ADMINTOOLS, + CSIDL_COMMON_ADMINTOOLS|KFD_TODO_WINE, "Common Administrative Tools", KF_CATEGORY_COMMON, FOLDERID_CommonPrograms, GUID_NULL, @@ -980,7 +981,8 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_CommonOEMLinks, - CSIDL_COMMON_OEM_LINKS,"OEM Links", + CSIDL_COMMON_OEM_LINKS|KFD_TODO_WINE, + "OEM Links", KF_CATEGORY_COMMON, FOLDERID_ProgramData, GUID_NULL, "OEM Links", @@ -1006,7 +1008,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_CommonStartup, - CSIDL_COMMON_STARTUP, + CSIDL_COMMON_STARTUP|KFD_TODO_WINE, "Common Startup", KF_CATEGORY_COMMON, FOLDERID_CommonPrograms, GUID_NULL, @@ -1015,7 +1017,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_CommonTemplates, - CSIDL_COMMON_TEMPLATES, + CSIDL_COMMON_TEMPLATES|KFD_TODO_WINE, "Common Templates", KF_CATEGORY_COMMON, FOLDERID_ProgramData, GUID_NULL, @@ -1024,7 +1026,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ComputerFolder, - CSIDL_DRIVES, + CSIDL_DRIVES|KFD_TODO_WINE, "MyComputerFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1033,7 +1035,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ConflictFolder, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "ConflictFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1043,7 +1045,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ConnectionsFolder, - CSIDL_CONNECTIONS, + CSIDL_CONNECTIONS|KFD_TODO_WINE, "ConnectionsFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1053,7 +1055,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Contacts, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Contacts", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1062,7 +1064,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_ControlPanelFolder, - CSIDL_CONTROLS, + CSIDL_CONTROLS|KFD_TODO_WINE, "ControlPanelFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1072,7 +1074,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Cookies, - CSIDL_COOKIES, + CSIDL_COOKIES|KFD_TODO_WINE, "Cookies", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, FOLDERID_LocalAppData, @@ -1090,7 +1092,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_DeviceMetadataStore, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Device Metadata Store", KF_CATEGORY_COMMON, FOLDERID_ProgramData, GUID_NULL, @@ -1099,7 +1101,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Documents, - CSIDL_MYDOCUMENTS, + CSIDL_MYDOCUMENTS|KFD_TODO_WINE, "Personal", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1108,7 +1110,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_DocumentsLibrary, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "DocumentsLibrary", KF_CATEGORY_PERUSER, FOLDERID_Libraries, GUID_NULL, @@ -1117,7 +1119,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_PRECREATE | KFDF_STREAM), KNOWN_FOLDER(FOLDERID_Downloads, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Downloads", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1126,7 +1128,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_Favorites, - CSIDL_FAVORITES, + CSIDL_FAVORITES|KFD_TODO_WINE, "Favorites", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1144,7 +1146,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Games, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Games", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1153,7 +1155,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_GameTasks, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "GameTasks", KF_CATEGORY_PERUSER, FOLDERID_LocalAppData, GUID_NULL, @@ -1162,7 +1164,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_LOCAL_REDIRECT_ONLY), KNOWN_FOLDER(FOLDERID_History, - CSIDL_HISTORY, + CSIDL_HISTORY|KFD_TODO_WINE, "History", KF_CATEGORY_PERUSER, FOLDERID_LocalAppData, GUID_NULL, @@ -1171,7 +1173,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_LOCAL_REDIRECT_ONLY), KNOWN_FOLDER(FOLDERID_HomeGroup, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "HomeGroupFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1180,7 +1182,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ImplicitAppShortcuts, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "ImplicitAppShortcuts", KF_CATEGORY_PERUSER, FOLDERID_UserPinned, GUID_NULL, @@ -1189,7 +1191,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_InternetCache, - CSIDL_INTERNET_CACHE, + CSIDL_INTERNET_CACHE|KFD_TODO_WINE, "Cache", KF_CATEGORY_PERUSER, FOLDERID_LocalAppData, GUID_NULL, @@ -1198,7 +1200,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_LOCAL_REDIRECT_ONLY), KNOWN_FOLDER(FOLDERID_InternetFolder, - CSIDL_INTERNET, + CSIDL_INTERNET|KFD_TODO_WINE, "InternetFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1207,7 +1209,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Libraries, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Libraries", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, GUID_NULL, @@ -1216,7 +1218,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_Links, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Links", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1225,7 +1227,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_LocalAppData, - CSIDL_LOCAL_APPDATA, + CSIDL_LOCAL_APPDATA|KFD_TODO_WINE, "Local AppData", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1234,7 +1236,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_LOCAL_REDIRECT_ONLY | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_LocalAppDataLow, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "LocalAppDataLow", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1243,7 +1245,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, KFDF_LOCAL_REDIRECT_ONLY | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_LocalizedResourcesDir, - CSIDL_RESOURCES_LOCALIZED, + CSIDL_RESOURCES_LOCALIZED|KFD_TODO_WINE, "LocalizedResourcesDir", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1252,7 +1254,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Music, - CSIDL_MYMUSIC, + CSIDL_MYMUSIC|KFD_TODO_WINE, "My Music", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1261,7 +1263,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_MusicLibrary, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "MusicLibrary", KF_CATEGORY_PERUSER, FOLDERID_Libraries, GUID_NULL, @@ -1270,7 +1272,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_PRECREATE | KFDF_STREAM), KNOWN_FOLDER(FOLDERID_NetHood, - CSIDL_NETHOOD, + CSIDL_NETHOOD|KFD_TODO_WINE, "NetHood", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, GUID_NULL, @@ -1279,7 +1281,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_NetworkFolder, - CSIDL_NETWORK, + CSIDL_NETWORK|KFD_TODO_WINE, "NetworkPlacesFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1288,7 +1290,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_OriginalImages, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Original Images", KF_CATEGORY_PERUSER, FOLDERID_LocalAppData, GUID_NULL, @@ -1297,7 +1299,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_PhotoAlbums, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "PhotoAlbums", KF_CATEGORY_PERUSER, FOLDERID_Pictures, GUID_NULL, @@ -1306,7 +1308,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, 0), KNOWN_FOLDER(FOLDERID_Pictures, - CSIDL_MYPICTURES, + CSIDL_MYPICTURES|KFD_TODO_WINE, "My Pictures", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1315,7 +1317,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PicturesLibrary, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "PicturesLibrary", KF_CATEGORY_PERUSER, FOLDERID_Libraries, GUID_NULL, @@ -1324,7 +1326,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_PRECREATE | KFDF_STREAM), KNOWN_FOLDER(FOLDERID_Playlists, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Playlists", KF_CATEGORY_PERUSER, FOLDERID_Music, GUID_NULL, @@ -1333,7 +1335,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, 0), KNOWN_FOLDER(FOLDERID_PrintersFolder, - CSIDL_PRINTERS, + CSIDL_PRINTERS|KFD_TODO_WINE, "PrintersFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1342,7 +1344,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_PrintHood, - CSIDL_PRINTHOOD, + CSIDL_PRINTHOOD|KFD_TODO_WINE, "PrintHood", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, GUID_NULL, @@ -1351,7 +1353,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Profile, - CSIDL_PROFILE, + CSIDL_PROFILE|KFD_TODO_WINE, "Profile", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1388,7 +1390,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ProgramFilesCommonX64, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "ProgramFilesCommonX64", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1397,7 +1399,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ProgramFilesCommonX86, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "ProgramFilesCommonX86", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1406,7 +1408,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ProgramFilesX64, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "ProgramFilesX64", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1415,7 +1417,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ProgramFilesX86, - CSIDL_PROGRAM_FILESX86, + CSIDL_PROGRAM_FILESX86|KFD_TODO_WINE, "ProgramFilesX86", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1424,7 +1426,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_Programs, - CSIDL_PROGRAMS, + CSIDL_PROGRAMS|KFD_TODO_WINE, "Programs", KF_CATEGORY_PERUSER, FOLDERID_StartMenu, GUID_NULL, @@ -1433,7 +1435,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_Public, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Public", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1443,7 +1445,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PublicDesktop, - CSIDL_COMMON_DESKTOPDIRECTORY, + CSIDL_COMMON_DESKTOPDIRECTORY|KFD_TODO_WINE, "Common Desktop", KF_CATEGORY_COMMON, FOLDERID_Public, GUID_NULL, @@ -1452,7 +1454,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PublicDocuments, - CSIDL_COMMON_DOCUMENTS, + CSIDL_COMMON_DOCUMENTS|KFD_TODO_WINE, "Common Documents", KF_CATEGORY_COMMON, FOLDERID_Public, GUID_NULL, @@ -1461,7 +1463,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PublicDownloads, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "CommonDownloads", KF_CATEGORY_COMMON, FOLDERID_Public, GUID_NULL, @@ -1470,7 +1472,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PublicGameTasks, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "PublicGameTasks", KF_CATEGORY_COMMON, FOLDERID_ProgramData, GUID_NULL, @@ -1479,7 +1481,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_LOCAL_REDIRECT_ONLY), KNOWN_FOLDER(FOLDERID_PublicLibraries, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "PublicLibraries", KF_CATEGORY_COMMON, FOLDERID_Public, GUID_NULL, @@ -1488,7 +1490,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PublicMusic, - CSIDL_COMMON_MUSIC, + CSIDL_COMMON_MUSIC|KFD_TODO_WINE, "CommonMusic", KF_CATEGORY_COMMON, FOLDERID_Public, GUID_NULL, @@ -1497,7 +1499,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PublicPictures, - CSIDL_COMMON_PICTURES, + CSIDL_COMMON_PICTURES|KFD_TODO_WINE, "CommonPictures", KF_CATEGORY_COMMON, FOLDERID_Public, GUID_NULL, @@ -1506,7 +1508,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PublicRingtones, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "CommonRingtones", KF_CATEGORY_COMMON, FOLDERID_ProgramData, GUID_NULL, @@ -1515,7 +1517,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_PublicVideos, - CSIDL_COMMON_VIDEO, + CSIDL_COMMON_VIDEO|KFD_TODO_WINE, "CommonVideo", KF_CATEGORY_COMMON, FOLDERID_Public, GUID_NULL, @@ -1524,7 +1526,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_QuickLaunch, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Quick Launch", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, GUID_NULL, @@ -1533,7 +1535,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Recent, - CSIDL_RECENT, + CSIDL_RECENT|KFD_TODO_WINE, "Recent", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, GUID_NULL, @@ -1542,7 +1544,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_RecordedTVLibrary, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "RecordedTVLibrary", KF_CATEGORY_COMMON, FOLDERID_PublicLibraries, GUID_NULL, @@ -1551,7 +1553,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_PRECREATE | KFDF_STREAM), KNOWN_FOLDER(FOLDERID_RecycleBinFolder, - CSIDL_BITBUCKET, + CSIDL_BITBUCKET|KFD_TODO_WINE, "RecycleBinFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1560,7 +1562,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_ResourceDir, - CSIDL_RESOURCES, + CSIDL_RESOURCES|KFD_TODO_WINE, "ResourceDir", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1569,7 +1571,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Ringtones, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Ringtones", KF_CATEGORY_PERUSER, FOLDERID_LocalAppData, GUID_NULL, @@ -1578,7 +1580,7 @@ static const struct knownFolderDef known_folders[] = { 0, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_RoamingAppData, - CSIDL_APPDATA, + CSIDL_APPDATA|KFD_TODO_WINE, "AppData", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1587,7 +1589,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SampleMusic, - NO_CSIDL|WINE_ATTRIBUTES_OPTIONAL /* win8 */, + NO_CSIDL|KFD_TODO_WINE|WINE_ATTRIBUTES_OPTIONAL /* win8 */, "SampleMusic", KF_CATEGORY_COMMON, FOLDERID_PublicMusic, GUID_NULL, @@ -1596,7 +1598,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_SamplePictures, - NO_CSIDL|WINE_ATTRIBUTES_OPTIONAL /* win8 */, + NO_CSIDL|KFD_TODO_WINE|WINE_ATTRIBUTES_OPTIONAL /* win8 */, "SamplePictures", KF_CATEGORY_COMMON, FOLDERID_PublicPictures, GUID_NULL, @@ -1605,7 +1607,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_SamplePlaylists, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "SamplePlaylists", KF_CATEGORY_COMMON, FOLDERID_PublicMusic, GUID_NULL, @@ -1614,7 +1616,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, 0), KNOWN_FOLDER(FOLDERID_SampleVideos, - NO_CSIDL|WINE_ATTRIBUTES_OPTIONAL /* win8 */, + NO_CSIDL|KFD_TODO_WINE|WINE_ATTRIBUTES_OPTIONAL /* win8 */, "SampleVideos", KF_CATEGORY_COMMON, FOLDERID_PublicVideos, GUID_NULL, @@ -1623,7 +1625,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_SavedGames, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "SavedGames", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1632,7 +1634,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_SavedSearches, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Searches", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1641,7 +1643,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE | KFDF_PUBLISHEXPANDEDPATH), KNOWN_FOLDER(FOLDERID_SEARCH_CSC, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "CSCFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1650,7 +1652,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SearchHome, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "SearchHomeFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1659,7 +1661,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SEARCH_MAPI, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "MAPIFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1668,7 +1670,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SendTo, - CSIDL_SENDTO, + CSIDL_SENDTO|KFD_TODO_WINE, "SendTo", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, GUID_NULL, @@ -1677,7 +1679,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SidebarDefaultParts, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Default Gadgets", KF_CATEGORY_COMMON, FOLDERID_ProgramFiles, GUID_NULL, @@ -1686,7 +1688,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SidebarParts, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "Gadgets", KF_CATEGORY_PERUSER, FOLDERID_LocalAppData, GUID_NULL, @@ -1695,7 +1697,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_StartMenu, - CSIDL_STARTMENU, + CSIDL_STARTMENU|KFD_TODO_WINE, "Start Menu", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, GUID_NULL, @@ -1704,7 +1706,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_Startup, - CSIDL_STARTUP, + CSIDL_STARTUP|KFD_TODO_WINE, "Startup", KF_CATEGORY_PERUSER, FOLDERID_Programs, GUID_NULL, @@ -1713,7 +1715,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_SyncManagerFolder, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "SyncCenterFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1723,7 +1725,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SyncResultsFolder, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "SyncResultsFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1733,7 +1735,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SyncSetupFolder, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "SyncSetupFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1752,7 +1754,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_SystemX86, - CSIDL_SYSTEMX86, + CSIDL_SYSTEMX86|KFD_TODO_WINE, "SystemX86", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1761,7 +1763,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Templates, - CSIDL_TEMPLATES, + CSIDL_TEMPLATES|KFD_TODO_WINE, "Templates", KF_CATEGORY_PERUSER, FOLDERID_RoamingAppData, GUID_NULL, @@ -1770,7 +1772,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_UserPinned, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "User Pinned", KF_CATEGORY_PERUSER, FOLDERID_QuickLaunch, GUID_NULL, @@ -1779,7 +1781,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_HIDDEN, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_UserProfiles, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "UserProfiles", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1788,7 +1790,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_UserProgramFiles, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "UserProgramFiles", KF_CATEGORY_PERUSER, FOLDERID_LocalAppData, GUID_NULL, @@ -1797,7 +1799,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_UserProgramFilesCommon, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "UserProgramFilesCommon", KF_CATEGORY_PERUSER, FOLDERID_UserProgramFiles, GUID_NULL, @@ -1806,7 +1808,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_UsersFiles, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "UsersFilesFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1815,7 +1817,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_UsersLibraries, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "UsersLibrariesFolder", KF_CATEGORY_VIRTUAL, GUID_NULL, GUID_NULL, @@ -1824,7 +1826,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(FOLDERID_Videos, - CSIDL_MYVIDEO, + CSIDL_MYVIDEO|KFD_TODO_WINE, "My Video", KF_CATEGORY_PERUSER, FOLDERID_Profile, GUID_NULL, @@ -1833,7 +1835,7 @@ static const struct knownFolderDef known_folders[] = { FILE_ATTRIBUTE_READONLY, KFDF_ROAMABLE | KFDF_PRECREATE), KNOWN_FOLDER(FOLDERID_VideosLibrary, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "VideosLibrary", KF_CATEGORY_PERUSER, FOLDERID_Libraries, GUID_NULL, @@ -1851,7 +1853,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(_FOLDERID_CredentialManager, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "CredentialManager", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1860,7 +1862,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(_FOLDERID_CryptoKeys, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "CryptoKeys", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1869,7 +1871,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(_FOLDERID_DpapiKeys, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "DpapiKeys", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1878,7 +1880,7 @@ static const struct knownFolderDef known_folders[] = { 0, 0), KNOWN_FOLDER(_FOLDERID_SystemCertificates, - NO_CSIDL, + NO_CSIDL|KFD_TODO_WINE, "SystemCertificates", KF_CATEGORY_FIXED, GUID_NULL, GUID_NULL, @@ -1955,14 +1957,16 @@ static void check_known_folder(IKnownFolderManager *mgr, KNOWNFOLDERID *folderId if(SUCCEEDED(hr)) { hr = IKnownFolder_GetFolderDefinition(folder, &kfd); - todo_wine - ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot get known folder definition for %s\n", known_folder->sFolderId); + if(known_folder->csidl & KFD_TODO_WINE) + todo_wine + ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot get known folder definition for %s\n", known_folder->sFolderId); + else + ok_(__FILE__, known_folder->line)(hr == S_OK, "cannot get known folder definition for %s\n", known_folder->sFolderId); if(SUCCEEDED(hr)) { ret = MultiByteToWideChar(CP_ACP, 0, known_folder->sName, -1, sName, sizeof(sName)/sizeof(sName[0])); ok_(__FILE__, known_folder->line)(ret != 0, "cannot convert known folder name \"%s\" to wide characters\n", known_folder->sName); - todo_wine ok_(__FILE__, known_folder->line)(lstrcmpW(kfd.pszName, sName)==0, "invalid known folder name returned for %s: %s expected, but %s retrieved\n", known_folder->sFolderId, wine_dbgstr_w(sName), wine_dbgstr_w(kfd.pszName)); ok_(__FILE__, known_folder->line)(kfd.category == known_folder->category, "invalid known folder category for %s: %d expected, but %d retrieved\n", known_folder->sFolderId, known_folder->category, kfd.category); @@ -2091,9 +2095,7 @@ static void test_knownFolders(void) if(SUCCEEDED(hr)) { hr = IKnownFolder_GetCategory(folder, &cat); - todo_wine ok(hr == S_OK, "failed to get folder category: 0x%08x\n", hr); - todo_wine ok(cat==KF_CATEGORY_FIXED, "invalid folder category: %d\n", cat); hr = IKnownFolder_GetId(folder, &folderId); @@ -2116,15 +2118,11 @@ static void test_knownFolders(void) ok(hr == E_INVALIDARG, "unexpected value from SetPath: 0x%08x\n", hr); hr = IKnownFolder_GetFolderDefinition(folder, &kfDefinition); - todo_wine ok(hr == S_OK, "failed to get folder definition: 0x%08x\n", hr); if(SUCCEEDED(hr)) { - todo_wine ok(kfDefinition.category==KF_CATEGORY_FIXED, "invalid folder category: 0x%08x\n", kfDefinition.category); - todo_wine ok(lstrcmpW(kfDefinition.pszName, sWindows)==0, "invalid folder name: %s\n", wine_dbgstr_w(kfDefinition.pszName)); - todo_wine ok(kfDefinition.dwAttributes==0, "invalid folder attributes: %d\n", kfDefinition.dwAttributes); FreeKnownFolderDefinitionFields(&kfDefinition); }