📄 shellpath.c
字号:
},
{ /* 0x01 - CSIDL_INTERNET */
CSIDL_Type_Disallowed,
NULL,
NULL
},
{ /* 0x02 - CSIDL_PROGRAMS */
CSIDL_Type_User,
ProgramsW,
MAKEINTRESOURCEW(IDS_PROGRAMS)
},
{ /* 0x03 - CSIDL_CONTROLS (.CPL files) */
CSIDL_Type_SystemPath,
NULL,
NULL
},
{ /* 0x04 - CSIDL_PRINTERS */
CSIDL_Type_SystemPath,
NULL,
NULL
},
{ /* 0x05 - CSIDL_PERSONAL */
CSIDL_Type_User,
PersonalW,
MAKEINTRESOURCEW(IDS_PERSONAL)
},
{ /* 0x06 - CSIDL_FAVORITES */
CSIDL_Type_User,
FavoritesW,
MAKEINTRESOURCEW(IDS_FAVORITES)
},
{ /* 0x07 - CSIDL_STARTUP */
CSIDL_Type_User,
StartUpW,
MAKEINTRESOURCEW(IDS_STARTUP)
},
{ /* 0x08 - CSIDL_RECENT */
CSIDL_Type_User,
RecentW,
MAKEINTRESOURCEW(IDS_RECENT)
},
{ /* 0x09 - CSIDL_SENDTO */
CSIDL_Type_User,
SendToW,
MAKEINTRESOURCEW(IDS_SENDTO)
},
{ /* 0x0a - CSIDL_BITBUCKET - Recycle Bin */
CSIDL_Type_Disallowed,
NULL,
NULL,
},
{ /* 0x0b - CSIDL_STARTMENU */
CSIDL_Type_User,
Start_MenuW,
MAKEINTRESOURCEW(IDS_STARTMENU)
},
{ /* 0x0c - CSIDL_MYDOCUMENTS */
CSIDL_Type_Disallowed, /* matches WinXP--can't get its path */
NULL,
NULL
},
{ /* 0x0d - CSIDL_MYMUSIC */
CSIDL_Type_User,
My_MusicW,
MAKEINTRESOURCEW(IDS_MYMUSIC)
},
{ /* 0x0e - CSIDL_MYVIDEO */
CSIDL_Type_User,
My_VideoW,
MAKEINTRESOURCEW(IDS_MYVIDEO)
},
{ /* 0x0f - unassigned */
CSIDL_Type_Disallowed,
NULL,
NULL,
},
{ /* 0x10 - CSIDL_DESKTOPDIRECTORY */
CSIDL_Type_User,
DesktopW,
MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY)
},
{ /* 0x11 - CSIDL_DRIVES */
CSIDL_Type_Disallowed,
NULL,
NULL,
},
{ /* 0x12 - CSIDL_NETWORK */
CSIDL_Type_Disallowed,
NULL,
NULL,
},
{ /* 0x13 - CSIDL_NETHOOD */
CSIDL_Type_User,
NetHoodW,
MAKEINTRESOURCEW(IDS_NETHOOD)
},
{ /* 0x14 - CSIDL_FONTS */
CSIDL_Type_WindowsPath,
NULL,
FontsW
},
{ /* 0x15 - CSIDL_TEMPLATES */
CSIDL_Type_User,
TemplatesW,
MAKEINTRESOURCEW(IDS_TEMPLATES)
},
{ /* 0x16 - CSIDL_COMMON_STARTMENU */
CSIDL_Type_AllUsers,
Common_Start_MenuW,
MAKEINTRESOURCEW(IDS_STARTMENU)
},
{ /* 0x17 - CSIDL_COMMON_PROGRAMS */
CSIDL_Type_AllUsers,
Common_ProgramsW,
MAKEINTRESOURCEW(IDS_PROGRAMS)
},
{ /* 0x18 - CSIDL_COMMON_STARTUP */
CSIDL_Type_AllUsers,
Common_StartUpW,
MAKEINTRESOURCEW(IDS_STARTUP)
},
{ /* 0x19 - CSIDL_COMMON_DESKTOPDIRECTORY */
CSIDL_Type_AllUsers,
Common_DesktopW,
MAKEINTRESOURCEW(IDS_DESKTOP)
},
{ /* 0x1a - CSIDL_APPDATA */
CSIDL_Type_User,
AppDataW,
MAKEINTRESOURCEW(IDS_APPDATA)
},
{ /* 0x1b - CSIDL_PRINTHOOD */
CSIDL_Type_User,
PrintHoodW,
MAKEINTRESOURCEW(IDS_PRINTHOOD)
},
{ /* 0x1c - CSIDL_LOCAL_APPDATA */
CSIDL_Type_User,
Local_AppDataW,
MAKEINTRESOURCEW(IDS_LOCAL_APPDATA)
},
{ /* 0x1d - CSIDL_ALTSTARTUP */
CSIDL_Type_NonExistent,
NULL,
NULL
},
{ /* 0x1e - CSIDL_COMMON_ALTSTARTUP */
CSIDL_Type_NonExistent,
NULL,
NULL
},
{ /* 0x1f - CSIDL_COMMON_FAVORITES */
CSIDL_Type_AllUsers,
FavoritesW,
MAKEINTRESOURCEW(IDS_FAVORITES)
},
{ /* 0x20 - CSIDL_INTERNET_CACHE */
CSIDL_Type_User,
CacheW,
MAKEINTRESOURCEW(IDS_INTERNET_CACHE)
},
{ /* 0x21 - CSIDL_COOKIES */
CSIDL_Type_User,
CookiesW,
MAKEINTRESOURCEW(IDS_COOKIES)
},
{ /* 0x22 - CSIDL_HISTORY */
CSIDL_Type_User,
HistoryW,
MAKEINTRESOURCEW(IDS_HISTORY)
},
{ /* 0x23 - CSIDL_COMMON_APPDATA */
CSIDL_Type_AllUsers,
Common_AppDataW,
MAKEINTRESOURCEW(IDS_APPDATA)
},
{ /* 0x24 - CSIDL_WINDOWS */
CSIDL_Type_WindowsPath,
NULL,
NULL
},
{ /* 0x25 - CSIDL_SYSTEM */
CSIDL_Type_SystemPath,
NULL,
NULL
},
{ /* 0x26 - CSIDL_PROGRAM_FILES */
CSIDL_Type_CurrVer,
ProgramFilesDirW,
MAKEINTRESOURCEW(IDS_PROGRAM_FILES)
},
{ /* 0x27 - CSIDL_MYPICTURES */
CSIDL_Type_User,
My_PicturesW,
MAKEINTRESOURCEW(IDS_MYPICTURES)
},
{ /* 0x28 - CSIDL_PROFILE */
CSIDL_Type_User,
NULL,
NULL
},
{ /* 0x29 - CSIDL_SYSTEMX86 */
CSIDL_Type_NonExistent,
NULL,
NULL
},
{ /* 0x2a - CSIDL_PROGRAM_FILESX86 */
CSIDL_Type_NonExistent,
NULL,
NULL
},
{ /* 0x2b - CSIDL_PROGRAM_FILES_COMMON */
CSIDL_Type_CurrVer,
CommonFilesDirW,
MAKEINTRESOURCEW(IDS_PROGRAM_FILES_COMMON)
},
{ /* 0x2c - CSIDL_PROGRAM_FILES_COMMONX86 */
CSIDL_Type_NonExistent,
NULL,
NULL
},
{ /* 0x2d - CSIDL_COMMON_TEMPLATES */
CSIDL_Type_AllUsers,
Common_TemplatesW,
MAKEINTRESOURCEW(IDS_TEMPLATES)
},
{ /* 0x2e - CSIDL_COMMON_DOCUMENTS */
CSIDL_Type_AllUsers,
Common_DocumentsW,
MAKEINTRESOURCEW(IDS_COMMON_DOCUMENTS)
},
{ /* 0x2f - CSIDL_COMMON_ADMINTOOLS */
CSIDL_Type_AllUsers,
Common_Administrative_ToolsW,
MAKEINTRESOURCEW(IDS_ADMINTOOLS)
},
{ /* 0x30 - CSIDL_ADMINTOOLS */
CSIDL_Type_User,
Administrative_ToolsW,
MAKEINTRESOURCEW(IDS_ADMINTOOLS)
},
{ /* 0x31 - CSIDL_CONNECTIONS */
CSIDL_Type_Disallowed,
NULL,
NULL
},
{ /* 0x32 - unassigned */
CSIDL_Type_Disallowed,
NULL,
NULL
},
{ /* 0x33 - unassigned */
CSIDL_Type_Disallowed,
NULL,
NULL
},
{ /* 0x34 - unassigned */
CSIDL_Type_Disallowed,
NULL,
NULL
},
{ /* 0x35 - CSIDL_COMMON_MUSIC */
CSIDL_Type_AllUsers,
CommonMusicW,
MAKEINTRESOURCEW(IDS_COMMON_MUSIC)
},
{ /* 0x36 - CSIDL_COMMON_PICTURES */
CSIDL_Type_AllUsers,
CommonPicturesW,
MAKEINTRESOURCEW(IDS_COMMON_PICTURES)
},
{ /* 0x37 - CSIDL_COMMON_VIDEO */
CSIDL_Type_AllUsers,
CommonVideoW,
MAKEINTRESOURCEW(IDS_COMMON_VIDEO)
},
{ /* 0x38 - CSIDL_RESOURCES */
CSIDL_Type_WindowsPath,
NULL,
ResourcesW
},
{ /* 0x39 - CSIDL_RESOURCES_LOCALIZED */
CSIDL_Type_NonExistent,
NULL,
NULL
},
{ /* 0x3a - CSIDL_COMMON_OEM_LINKS */
CSIDL_Type_NonExistent,
NULL,
NULL
},
{ /* 0x3b - CSIDL_CDBURN_AREA */
CSIDL_Type_User,
CD_BurningW,
MAKEINTRESOURCEW(IDS_CDBURN_AREA)
},
{ /* 0x3c unassigned */
CSIDL_Type_Disallowed,
NULL,
NULL
},
{ /* 0x3d - CSIDL_COMPUTERSNEARME */
CSIDL_Type_Disallowed, /* FIXME */
NULL,
NULL
},
{ /* 0x3e - CSIDL_PROFILES */
CSIDL_Type_Disallowed, /* oddly, this matches WinXP */
NULL,
NULL
}
};
static HRESULT _SHExpandEnvironmentStrings(LPCWSTR szSrc, LPWSTR szDest);
/* Gets the value named value from the registry key
* rootKey\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
* (or from rootKey\userPrefix\... if userPrefix is not NULL) into path, which
* is assumed to be MAX_PATH WCHARs in length.
* If it exists, expands the value and writes the expanded value to
* rootKey\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
* Returns successful error code if the value was retrieved from the registry,
* and a failure otherwise.
*/
static HRESULT _SHGetUserShellFolderPath(HKEY rootKey, LPCWSTR userPrefix,
LPCWSTR value, LPWSTR path)
{
HRESULT hr;
WCHAR shellFolderPath[MAX_PATH], userShellFolderPath[MAX_PATH];
LPCWSTR pShellFolderPath, pUserShellFolderPath;
DWORD dwDisp, dwType, dwPathLen = MAX_PATH;
HKEY userShellFolderKey, shellFolderKey;
TRACE("%p,%s,%s,%p\n",rootKey, debugstr_w(userPrefix), debugstr_w(value),
path);
if (userPrefix)
{
strcpyW(shellFolderPath, userPrefix);
PathAddBackslashW(shellFolderPath);
strcatW(shellFolderPath, szSHFolders);
pShellFolderPath = shellFolderPath;
strcpyW(userShellFolderPath, userPrefix);
PathAddBackslashW(userShellFolderPath);
strcatW(userShellFolderPath, szSHUserFolders);
pUserShellFolderPath = userShellFolderPath;
}
else
{
pUserShellFolderPath = szSHUserFolders;
pShellFolderPath = szSHFolders;
}
if (RegCreateKeyExW(rootKey, pShellFolderPath, 0, NULL, 0, KEY_ALL_ACCESS,
NULL, &shellFolderKey, &dwDisp))
{
TRACE("Failed to create %s\n", debugstr_w(pShellFolderPath));
return E_FAIL;
}
if (RegCreateKeyExW(rootKey, pUserShellFolderPath, 0, NULL, 0,
KEY_ALL_ACCESS, NULL, &userShellFolderKey, &dwDisp))
{
TRACE("Failed to create %s\n",
debugstr_w(pUserShellFolderPath));
RegCloseKey(shellFolderKey);
return E_FAIL;
}
if (!RegQueryValueExW(userShellFolderKey, value, NULL, &dwType,
(LPBYTE)path, &dwPathLen) && (dwType == REG_EXPAND_SZ || dwType == REG_SZ))
{
LONG ret;
path[dwPathLen / sizeof(WCHAR)] = '\0';
if (dwType == REG_EXPAND_SZ && path[0] == '%')
{
WCHAR szTemp[MAX_PATH];
_SHExpandEnvironmentStrings(path, szTemp);
lstrcpynW(path, szTemp, MAX_PATH);
}
ret = RegSetValueExW(shellFolderKey, value, 0, REG_SZ, (LPBYTE)path,
(strlenW(path) + 1) * sizeof(WCHAR));
if (ret != ERROR_SUCCESS)
hr = HRESULT_FROM_WIN32(ret);
else
hr = S_OK;
}
else
hr = E_FAIL;
RegCloseKey(shellFolderKey);
RegCloseKey(userShellFolderKey);
TRACE("returning 0x%08lx\n", hr);
return hr;
}
/* 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.
* The types that are prepended with environment variables are:
* CSIDL_Type_User: %USERPROFILE%
* CSIDL_Type_AllUsers: %ALLUSERSPROFILE%
* CSIDL_Type_CurrVer: %SystemDrive%
* (Others might make sense too, but as yet are unneeded.)
*/
static HRESULT _SHGetDefaultValue(BYTE folder, LPWSTR pszPath)
{
HRESULT hr;
WCHAR resourcePath[MAX_PATH];
LPCWSTR pDefaultPath = NULL;
TRACE("0x%02x,%p\n", folder, pszPath);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -