Move all values of SHGetSpecialFolderPathA into an array, add some
other registry locations and improve the number of supported CSIDLs.
This commit is contained in:
parent
d7aea962dc
commit
4dc1892a06
|
@ -630,13 +630,286 @@ BOOL WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath)
|
||||||
* converts csidl to path
|
* converts csidl to path
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static char * szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
|
static const char * const szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
|
||||||
static char * szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
|
static const char * const szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
|
||||||
|
static const char * const szSetup = "Software\\Microsoft\\Windows\\CurrentVersion\\Setup";
|
||||||
|
static const char * const szCurrentVersion = "Software\\Microsoft\\Windows\\CurrentVersion";
|
||||||
#if 0
|
#if 0
|
||||||
static char * szEnvUserProfile = "%USERPROFILE%";
|
static const char * const szEnvUserProfile = "%USERPROFILE%";
|
||||||
static char * szEnvSystemRoot = "%SYSTEMROOT%";
|
static const char * const szEnvSystemRoot = "%SYSTEMROOT%";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
DWORD dwFlags;
|
||||||
|
HKEY hRootKey;
|
||||||
|
LPCSTR szValueName;
|
||||||
|
LPCSTR szDefaultPath; /* fallback string; sub dir of windows directory */
|
||||||
|
} CSIDL_DATA;
|
||||||
|
|
||||||
|
#define CSIDL_MYFLAG_SHFOLDER 1
|
||||||
|
#define CSIDL_MYFLAG_SETUP 2
|
||||||
|
#define CSIDL_MYFLAG_CURRVER 4
|
||||||
|
#define CSIDL_MYFLAG_RELATIVE 8
|
||||||
|
|
||||||
|
#define HKLM HKEY_LOCAL_MACHINE
|
||||||
|
#define HKCU HKEY_CURRENT_USER
|
||||||
|
static const CSIDL_DATA CSIDL_Data[] =
|
||||||
|
{
|
||||||
|
{ /* CSIDL_DESKTOP */
|
||||||
|
9, HKCU,
|
||||||
|
"Desktop",
|
||||||
|
"Desktop"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_INTERNET (??) */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PROGRAMS */
|
||||||
|
9, HKCU,
|
||||||
|
"Programs",
|
||||||
|
"Start Menu\\Programs"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_CONTROLS (.CPL files) */
|
||||||
|
10, HKLM,
|
||||||
|
"SysDir",
|
||||||
|
"SYSTEM"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PRINTERS */
|
||||||
|
10, HKLM,
|
||||||
|
"SysDir",
|
||||||
|
"SYSTEM"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PERSONAL */
|
||||||
|
1, HKCU,
|
||||||
|
"Personal",
|
||||||
|
"My Documents"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_FAVORITES */
|
||||||
|
9, HKCU,
|
||||||
|
"Favorites",
|
||||||
|
"Favorites"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_STARTUP */
|
||||||
|
9, HKCU,
|
||||||
|
"StartUp",
|
||||||
|
"Start Menu\\Programs\\StartUp"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_RECENT */
|
||||||
|
9, HKCU,
|
||||||
|
"Recent",
|
||||||
|
"Recent"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_SENDTO */
|
||||||
|
9, HKCU,
|
||||||
|
"SendTo",
|
||||||
|
"SendTo"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_BITBUCKET (??) */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{ /* CSIDL_STARTMENU */
|
||||||
|
9, HKCU,
|
||||||
|
"Start Menu",
|
||||||
|
"Start Menu"
|
||||||
|
},
|
||||||
|
{ /* not known */
|
||||||
|
0, 0,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
|
{ /* not known */
|
||||||
|
0, 0,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
|
{ /* not known */
|
||||||
|
0, 0,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
|
{ /* not known */
|
||||||
|
0, 0,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
|
{ /* CSIDL_DESKTOPDIRECTORY */
|
||||||
|
9, HKCU,
|
||||||
|
"Desktop",
|
||||||
|
"Desktop"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_DRIVES */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
"My Computer"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_NETWORK */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
"Network Neighborhood"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_NETHOOD */
|
||||||
|
9, HKCU,
|
||||||
|
"NetHood",
|
||||||
|
"NetHood"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_FONTS */
|
||||||
|
9, HKCU,
|
||||||
|
"Fonts",
|
||||||
|
"Fonts"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_TEMPLATES */
|
||||||
|
9, HKCU,
|
||||||
|
"Templates",
|
||||||
|
"ShellNew"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_STARTMENU */
|
||||||
|
9, HKLM,
|
||||||
|
"Common Start Menu",
|
||||||
|
"Start Menu"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_PROGRAMS */
|
||||||
|
9, HKLM,
|
||||||
|
"Common Programs",
|
||||||
|
""
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_STARTUP */
|
||||||
|
9, HKLM,
|
||||||
|
"Common StartUp",
|
||||||
|
"All Users\\Start Menu\\Programs\\StartUp"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_DESKTOPDIRECTORY */
|
||||||
|
9, HKLM,
|
||||||
|
"Common Desktop",
|
||||||
|
"Desktop"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_APPDATA */
|
||||||
|
9, HKCU,
|
||||||
|
"AppData",
|
||||||
|
"Application Data"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PRINTHOOD */
|
||||||
|
9, HKCU,
|
||||||
|
"PrintHood",
|
||||||
|
"PrintHood"
|
||||||
|
},
|
||||||
|
{ /* not known */
|
||||||
|
0, 0,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
|
{ /* CSIDL_ALTSTARTUP */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_ALTSTARTUP */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_FAVORITES */
|
||||||
|
9, HKCU,
|
||||||
|
"Favorites",
|
||||||
|
"Favorites"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_INTERNET_CACHE */
|
||||||
|
9, HKCU,
|
||||||
|
"Cache",
|
||||||
|
"Temporary Internet Files"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COOKIES */
|
||||||
|
9, HKCU,
|
||||||
|
"Cookies",
|
||||||
|
"Cookies"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_HISTORY */
|
||||||
|
9, HKCU,
|
||||||
|
"History",
|
||||||
|
"History"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_APPDATA */
|
||||||
|
9, HKLM,
|
||||||
|
"Common AppData",
|
||||||
|
"All Users\\Application Data"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_WINDOWS */
|
||||||
|
2, HKLM,
|
||||||
|
"WinDir",
|
||||||
|
"Windows"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_SYSTEM */
|
||||||
|
10, HKLM,
|
||||||
|
"SysDir",
|
||||||
|
"SYSTEM"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PROGRAM_FILES */
|
||||||
|
4, HKLM,
|
||||||
|
"ProgramFilesDir",
|
||||||
|
"Program Files"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_MYPICTURES */
|
||||||
|
1, HKCU,
|
||||||
|
"My Pictures",
|
||||||
|
"My Documents\\My Pictures"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PROFILE */
|
||||||
|
10, HKLM,
|
||||||
|
"WinDir", /* correct ? */
|
||||||
|
""
|
||||||
|
},
|
||||||
|
{ /* CSIDL_SYSTEMX86 */
|
||||||
|
10, HKLM,
|
||||||
|
"SysDir",
|
||||||
|
"SYSTEM"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PROGRAM_FILESX86 */
|
||||||
|
4, HKLM,
|
||||||
|
"ProgramFilesDir",
|
||||||
|
"Program Files"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PROGRAM_FILES_COMMON */
|
||||||
|
4, HKLM,
|
||||||
|
"CommonFilesDir",
|
||||||
|
"Program Files\\Common Files" /* ? */
|
||||||
|
},
|
||||||
|
{ /* CSIDL_PROGRAM_FILES_COMMONX86 */
|
||||||
|
4, HKLM,
|
||||||
|
"CommonFilesDir",
|
||||||
|
"Program Files\\Common Files" /* ? */
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_TEMPLATES */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_DOCUMENTS */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{ /* CSIDL_COMMON_ADMINTOOLS */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{ /* CSIDL_ADMINTOOLS */
|
||||||
|
9, HKCU,
|
||||||
|
"Administrative Tools",
|
||||||
|
"Start Menu\\Programs\\Administrative Tools"
|
||||||
|
},
|
||||||
|
{ /* CSIDL_CONNECTIONS */
|
||||||
|
0, 1, /* FIXME */
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#undef HKCU
|
||||||
|
#undef HKLM
|
||||||
|
|
||||||
BOOL WINAPI SHGetSpecialFolderPathA (
|
BOOL WINAPI SHGetSpecialFolderPathA (
|
||||||
HWND hwndOwner,
|
HWND hwndOwner,
|
||||||
LPSTR szPath,
|
LPSTR szPath,
|
||||||
|
@ -645,155 +918,81 @@ BOOL WINAPI SHGetSpecialFolderPathA (
|
||||||
{
|
{
|
||||||
CHAR szValueName[MAX_PATH], szDefaultPath[MAX_PATH];
|
CHAR szValueName[MAX_PATH], szDefaultPath[MAX_PATH];
|
||||||
HKEY hRootKey, hKey;
|
HKEY hRootKey, hKey;
|
||||||
BOOL bRelative = TRUE;
|
DWORD dwFlags;
|
||||||
DWORD dwType, dwDisp, dwPathLen = MAX_PATH;
|
DWORD dwType, dwDisp, dwPathLen = MAX_PATH;
|
||||||
|
DWORD folder = csidl & CSIDL_FOLDER_MASK;
|
||||||
|
|
||||||
TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
|
TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
|
||||||
|
|
||||||
/* build default values */
|
if ((folder > CSIDL_CONNECTIONS) || (CSIDL_Data[folder].hRootKey == 0))
|
||||||
switch(csidl)
|
|
||||||
{
|
{
|
||||||
case CSIDL_APPDATA:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy (szValueName, "AppData");
|
|
||||||
strcpy (szDefaultPath, "AppData");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_COOKIES:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy (szValueName, "Cookies");
|
|
||||||
strcpy(szDefaultPath, "Cookies");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_DESKTOPDIRECTORY:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Desktop");
|
|
||||||
strcpy(szDefaultPath, "Desktop");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_COMMON_DESKTOPDIRECTORY:
|
|
||||||
hRootKey = HKEY_LOCAL_MACHINE;
|
|
||||||
strcpy(szValueName, "Common Desktop");
|
|
||||||
strcpy(szDefaultPath, "Desktop");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_FAVORITES:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Favorites");
|
|
||||||
strcpy(szDefaultPath, "Favorites");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_FONTS:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Fonts");
|
|
||||||
strcpy(szDefaultPath, "Fonts");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_HISTORY:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "History");
|
|
||||||
strcpy(szDefaultPath, "History");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_NETHOOD:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "NetHood");
|
|
||||||
strcpy(szDefaultPath, "NetHood");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_INTERNET_CACHE:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Cache");
|
|
||||||
strcpy(szDefaultPath, "Temporary Internet Files");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_PERSONAL:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Personal");
|
|
||||||
strcpy(szDefaultPath, "My Own Files");
|
|
||||||
bRelative = FALSE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_PRINTHOOD:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "PrintHood");
|
|
||||||
strcpy(szDefaultPath, "PrintHood");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_PROGRAMS:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Programs");
|
|
||||||
strcpy(szDefaultPath, "Start Menu\\Programs");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_COMMON_PROGRAMS:
|
|
||||||
hRootKey = HKEY_LOCAL_MACHINE;
|
|
||||||
strcpy(szValueName, "Common Programs");
|
|
||||||
strcpy(szDefaultPath, "");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_RECENT:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Recent");
|
|
||||||
strcpy(szDefaultPath, "Recent");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_SENDTO:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "SendTo");
|
|
||||||
strcpy(szDefaultPath, "SendTo");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_STARTMENU:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Start Menu");
|
|
||||||
strcpy(szDefaultPath, "Start Menu");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_COMMON_STARTMENU:
|
|
||||||
hRootKey = HKEY_LOCAL_MACHINE;
|
|
||||||
strcpy(szValueName, "Common Start Menu");
|
|
||||||
strcpy(szDefaultPath, "Start Menu");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_STARTUP:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "StartUp");
|
|
||||||
strcpy(szDefaultPath, "Start Menu\\Programs\\StartUp");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_COMMON_STARTUP:
|
|
||||||
hRootKey = HKEY_LOCAL_MACHINE;
|
|
||||||
strcpy(szValueName, "Common StartUp");
|
|
||||||
strcpy(szDefaultPath, "Start Menu\\Programs\\StartUp");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CSIDL_TEMPLATES:
|
|
||||||
hRootKey = HKEY_CURRENT_USER;
|
|
||||||
strcpy(szValueName, "Templates");
|
|
||||||
strcpy(szDefaultPath, "ShellNew");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ERR("folder unknown or not allowed\n");
|
ERR("folder unknown or not allowed\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
if (CSIDL_Data[folder].hRootKey == 1)
|
||||||
/* user shell folders */
|
|
||||||
if (RegCreateKeyExA(hRootKey,szSHUserFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
|
|
||||||
|
|
||||||
if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
|
|
||||||
{
|
{
|
||||||
RegCloseKey(hKey);
|
FIXME("folder unknown, please add.\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* shell folders */
|
dwFlags = CSIDL_Data[folder].dwFlags;
|
||||||
if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
|
hRootKey = CSIDL_Data[folder].hRootKey;
|
||||||
|
strcpy(szValueName, CSIDL_Data[folder].szValueName);
|
||||||
|
strcpy(szDefaultPath, CSIDL_Data[folder].szDefaultPath);
|
||||||
|
|
||||||
if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
|
if (dwFlags & CSIDL_MYFLAG_SHFOLDER)
|
||||||
|
{
|
||||||
|
/* user shell folders */
|
||||||
|
if (RegCreateKeyExA(hRootKey,szSHUserFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
|
||||||
|
|
||||||
|
if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
|
||||||
{
|
{
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
|
||||||
|
/* shell folders */
|
||||||
|
if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
|
||||||
|
|
||||||
|
if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
|
||||||
|
{
|
||||||
|
|
||||||
|
/* value not existing */
|
||||||
|
if (dwFlags & CSIDL_MYFLAG_RELATIVE)
|
||||||
|
{
|
||||||
|
GetWindowsDirectoryA(szPath, MAX_PATH);
|
||||||
|
PathAddBackslashA(szPath);
|
||||||
|
strcat(szPath, szDefaultPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(szPath, "C:\\"); /* FIXME ??? */
|
||||||
|
strcat(szPath, szDefaultPath);
|
||||||
|
}
|
||||||
|
RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LPCSTR pRegPath;
|
||||||
|
|
||||||
|
if (dwFlags & CSIDL_MYFLAG_SETUP)
|
||||||
|
pRegPath = szSetup;
|
||||||
|
else
|
||||||
|
if (dwFlags & CSIDL_MYFLAG_CURRVER)
|
||||||
|
pRegPath = szCurrentVersion;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ERR("folder settings broken, please correct !\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegCreateKeyExA(hRootKey,pRegPath,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
|
||||||
|
|
||||||
|
if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
|
||||||
|
{
|
||||||
/* value not existing */
|
/* value not existing */
|
||||||
if (bRelative)
|
if (dwFlags & CSIDL_MYFLAG_RELATIVE)
|
||||||
{
|
{
|
||||||
GetWindowsDirectoryA(szPath, MAX_PATH);
|
GetWindowsDirectoryA(szPath, MAX_PATH);
|
||||||
PathAddBackslashA(szPath);
|
PathAddBackslashA(szPath);
|
||||||
|
@ -801,13 +1000,13 @@ BOOL WINAPI SHGetSpecialFolderPathA (
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcpy(szPath, "C:\\"); /* fixme ??? */
|
strcpy(szPath, "C:\\"); /* FIXME ??? */
|
||||||
strcat(szPath, szDefaultPath);
|
strcat(szPath, szDefaultPath);
|
||||||
}
|
}
|
||||||
RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
|
RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
|
||||||
}
|
}
|
||||||
|
RegCloseKey(hKey);
|
||||||
}
|
}
|
||||||
RegCloseKey(hKey);
|
|
||||||
|
|
||||||
/* expand paths like %USERPROFILE% */
|
/* expand paths like %USERPROFILE% */
|
||||||
if (dwType == REG_EXPAND_SZ)
|
if (dwType == REG_EXPAND_SZ)
|
||||||
|
@ -816,12 +1015,12 @@ BOOL WINAPI SHGetSpecialFolderPathA (
|
||||||
strcpy(szPath, szDefaultPath);
|
strcpy(szPath, szDefaultPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we don't care about existing directorys we are ready */
|
/* if we don't care about existing directories we are ready */
|
||||||
if(csidl & CSIDL_FLAG_DONT_VERIFY) return TRUE;
|
if(csidl & CSIDL_FLAG_DONT_VERIFY) return TRUE;
|
||||||
|
|
||||||
if (PathFileExistsA(szPath)) return TRUE;
|
if (PathFileExistsA(szPath)) return TRUE;
|
||||||
|
|
||||||
/* not existing but we not allowed to create it */
|
/* not existing but we are not allowed to create it */
|
||||||
if (!bCreate) return FALSE;
|
if (!bCreate) return FALSE;
|
||||||
|
|
||||||
if (!CreateDirectoryA(szPath,NULL))
|
if (!CreateDirectoryA(szPath,NULL))
|
||||||
|
|
Loading…
Reference in New Issue