https://git.reactos.org/?p=reactos.git;a=commitdiff;h=41a5b11fcd3e6cae64185…
commit 41a5b11fcd3e6cae64185d7e51b8ed9800d87ecd
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sat Sep 22 22:19:14 2018 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sun Sep 23 00:16:02 2018 +0200
[SHELL32] Partially synchronize wine/shellpath.c with Wine.
- Adjust the code with respect to:
"shell32: Re-add support for expanding ALLUSERSPROFILE for backward
compatibility."
4a6855a575c02aa1569aab8b2e96720fc02f3f26 (Alexandre Julliard)
- "shell32: Avoid infinite loop in _SHExpandEnvironmentStrings."
ceea5bda14ecf4c8ce262fc7ab88df49e500bc38 (Alexandre Julliard)
- "shell32: Assume that system directory always contains a drive letter."
54530bc4933ae1014c3697c95e22b8ca5a275bc4 (Alexandre Julliard)
- "shell32: Use ARRAY_SIZE macro."
612a1941331485725952d34f3dcd5866fc318dc2 (Nikolay Sivov)
- "shell32: Fix a trace message."
bb09bb5750d617047aa23635731519a2f9486159 (Nikolay Sivov)
- "shell32: Fix SHGetFolderPathAndSubDir() trace message."
f75d5625966933562b974540a3f29dfcd720ad50 (Nikolay Sivov)
- "shell32: Pass correct buffer length to RegQueryValueExW()."
0bfb97dcba29552b51d8609fcc6e7bbc04bb8320 (Nikolay Sivov)
- "shell32: Remove unused string (Clang)."
8d50a8a246960749afba21eac117b4fcbbf2c79d (André Hentschel)
- "shell32: Use E_NOT_SUFFICIENT_BUFFER definition."
730e744e3bd6b706612fe0f90a7efb2e600f114f (Nikolay Sivov)
---
dll/win32/shell32/wine/shell32_main.h | 2 +
dll/win32/shell32/wine/shellpath.c | 80 +++++++++++++++++++----------------
2 files changed, 46 insertions(+), 36 deletions(-)
diff --git a/dll/win32/shell32/wine/shell32_main.h
b/dll/win32/shell32/wine/shell32_main.h
index 170d844b4b..1653697538 100644
--- a/dll/win32/shell32/wine/shell32_main.h
+++ b/dll/win32/shell32/wine/shell32_main.h
@@ -26,6 +26,8 @@
extern "C" {
#endif
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
+
/*******************************************
* global SHELL32.DLL variables
*/
diff --git a/dll/win32/shell32/wine/shellpath.c b/dll/win32/shell32/wine/shellpath.c
index d1a3ada74e..6396641a15 100644
--- a/dll/win32/shell32/wine/shellpath.c
+++ b/dll/win32/shell32/wine/shellpath.c
@@ -578,7 +578,6 @@ 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'};
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_DocumentsW[] = {'M','y','
','D','o','c','u','m','e','n','t','s','\0'};
#endif
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'};
@@ -601,6 +600,9 @@ static const WCHAR Program_Files_x86_Common_FilesW[] =
{'P','r','o','g','r','a',
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'};
+#ifndef __REACTOS__
+static const WCHAR PublicW[] =
{'P','u','b','l','i','c',0};
+#endif
static const WCHAR RecentW[] =
{'R','e','c','e','n','t','\0'};
static const WCHAR ResourcesW[] =
{'R','e','s','o','u','r','c','e','s','\0'};
#ifndef __REACTOS__
@@ -624,6 +626,9 @@ static const WCHAR Videos_Sample_VideosW[] =
{'V','i','d','e','o','s','\\','S','
#endif
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'};
+#ifndef __REACTOS__
+static const WCHAR PublicProfileW[] =
{'%','P','U','B','L','I','C','%',0};
+#endif
static const WCHAR UserProfileW[] =
{'%','U','S','E','R','P','R','O','F','I','L','E','%','\0'};
static const WCHAR SystemDriveW[] =
{'%','S','y','s','t','e','m','D','r','i','v','e','%','\0'};
#ifndef __REACTOS__
@@ -1425,8 +1430,8 @@ static HRESULT _SHGetUserShellFolderPath(HKEY rootKey, HANDLE
hToken, LPCWSTR us
HRESULT hr;
WCHAR shellFolderPath[MAX_PATH], userShellFolderPath[MAX_PATH];
LPCWSTR pShellFolderPath, pUserShellFolderPath;
- DWORD dwType, dwPathLen = MAX_PATH;
HKEY userShellFolderKey, shellFolderKey;
+ DWORD dwType, dwPathLen;
TRACE("%p,%s,%s,%p\n",rootKey, debugstr_w(userPrefix), debugstr_w(value),
path);
@@ -1461,6 +1466,7 @@ static HRESULT _SHGetUserShellFolderPath(HKEY rootKey, HANDLE
hToken, LPCWSTR us
return E_FAIL;
}
+ dwPathLen = MAX_PATH * sizeof(WCHAR);
if (!RegQueryValueExW(userShellFolderKey, value, NULL, &dwType,
(LPBYTE)path, &dwPathLen) && (dwType == REG_EXPAND_SZ || dwType ==
REG_SZ))
{
@@ -1539,8 +1545,9 @@ static HRESULT _SHGetDefaultValue(HANDLE hToken, BYTE folder, LPWSTR
pszPath)
TRACE("0x%02x,%p\n", folder, pszPath);
- if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0]))
+ if (folder >= ARRAY_SIZE(CSIDL_Data))
return E_INVALIDARG;
+
if (!pszPath)
return E_INVALIDARG;
@@ -1576,7 +1583,11 @@ static HRESULT _SHGetDefaultValue(HANDLE hToken, BYTE folder,
LPWSTR pszPath)
strcpyW(pszPath, UserProfileW);
break;
case CSIDL_Type_AllUsers:
+#ifndef __REACTOS__
+ strcpyW(pszPath, PublicProfileW);
+#else
strcpyW(pszPath, AllUsersProfileW);
+#endif
break;
case CSIDL_Type_CurrVer:
strcpyW(pszPath, SystemDriveW);
@@ -1624,7 +1635,7 @@ static HRESULT _SHGetCurrentVersionPath(DWORD dwFlags, BYTE folder,
TRACE("0x%08x,0x%02x,%p\n", dwFlags, folder, pszPath);
- if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0]))
+ if (folder >= ARRAY_SIZE(CSIDL_Data))
return E_INVALIDARG;
if (CSIDL_Data[folder].type != CSIDL_Type_CurrVer)
return E_INVALIDARG;
@@ -1736,7 +1747,7 @@ static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags,
BYTE folder,
TRACE("%p,0x%08x,0x%02x,%p\n", hToken, dwFlags, folder, pszPath);
- if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0]))
+ if (folder >= ARRAY_SIZE(CSIDL_Data))
return E_INVALIDARG;
if (CSIDL_Data[folder].type != CSIDL_Type_User)
return E_INVALIDARG;
@@ -1815,7 +1826,7 @@ static HRESULT _SHGetAllUsersProfilePath(DWORD dwFlags, BYTE
folder,
TRACE("0x%08x,0x%02x,%p\n", dwFlags, folder, pszPath);
- if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0]))
+ if (folder >= ARRAY_SIZE(CSIDL_Data))
return E_INVALIDARG;
if (CSIDL_Data[folder].type != CSIDL_Type_AllUsers)
return E_INVALIDARG;
@@ -1946,8 +1957,7 @@ static HRESULT _SHExpandEnvironmentStrings(HANDLE hToken, LPCWSTR
szSrc, LPWSTR
/* get the system drive */
GetSystemDirectoryW(def_val, MAX_PATH);
- if (def_val[1] == ':') strcpyW( def_val + 3, szDefaultProfileDirW );
- else FIXME("non-drive system paths unsupported\n");
+ strcpyW( def_val + 3, szDefaultProfileDirW );
hr = _SHGetProfilesValue(key, ProfilesDirectoryW, szProfilesPrefix, def_val );
}
@@ -1966,7 +1976,7 @@ static HRESULT _SHExpandEnvironmentStrings(HANDLE hToken, LPCWSTR
szSrc, LPWSTR
strcpyW(szDest, szProfilesPrefix);
hr = _SHGetProfilesValue(key, AllUsersProfileValueW,
- szAllUsers, AllUsersW);
+ szAllUsers, AllUsersW);
PathAppendW(szDest, szAllUsers);
#else
DWORD cchSize = cchDest;
@@ -1975,6 +1985,19 @@ static HRESULT _SHExpandEnvironmentStrings(HANDLE hToken, LPCWSTR
szSrc, LPWSTR
#endif
PathAppendW(szDest, szTemp + strlenW(AllUsersProfileW));
}
+#ifndef __REACTOS__
+ else if (!strncmpiW(szTemp, PublicProfileW, strlenW(PublicProfileW)))
+ {
+ WCHAR szAllUsers[MAX_PATH], def_val[MAX_PATH];
+
+ GetSystemDirectoryW(def_val, MAX_PATH);
+ strcpyW( def_val + 3, UsersPublicW );
+
+ hr = _SHGetProfilesValue(key, PublicW, szAllUsers, def_val);
+ PathAppendW(szDest, szAllUsers);
+ PathAppendW(szDest, szTemp + strlenW(PublicProfileW));
+ }
+#endif
else if (!strncmpiW(szTemp, UserProfileW, strlenW(UserProfileW)))
{
#ifndef __REACTOS__
@@ -1999,21 +2022,12 @@ static HRESULT _SHExpandEnvironmentStrings(HANDLE hToken, LPCWSTR
szSrc, LPWSTR
if (!GetSystemDirectoryW(szDest, cchDest))
return HRESULT_FROM_WIN32(GetLastError());
#endif
- if (szDest[1] != ':')
- {
- FIXME("non-drive system paths unsupported\n");
- hr = E_FAIL;
- }
- else
- {
- strcpyW(szDest + 3, szTemp + strlenW(SystemDriveW) + 1);
- hr = S_OK;
- }
+ strcpyW(szDest + 3, szTemp + strlenW(SystemDriveW) + 1);
}
else
{
#ifndef __REACTOS__
- DWORD ret = ExpandEnvironmentStringsW(szSrc, szDest, MAX_PATH);
+ DWORD ret = ExpandEnvironmentStringsW(szTemp, szDest, MAX_PATH);
#else
DWORD ret = SHExpandEnvironmentStringsForUserW(hToken, szSrc, szDest,
cchDest);
#endif
@@ -2023,19 +2037,12 @@ static HRESULT _SHExpandEnvironmentStrings(HANDLE hToken, LPCWSTR
szSrc, LPWSTR
#else
if (ret > cchDest)
#endif
- hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
+ hr = E_NOT_SUFFICIENT_BUFFER;
else if (ret == 0)
hr = HRESULT_FROM_WIN32(GetLastError());
- else
- hr = S_OK;
- }
- if (SUCCEEDED(hr) && szDest[0] == '%')
- strcpyW(szTemp, szDest);
- else
- {
- /* terminate loop */
- szTemp[0] = '\0';
+ else if (!strcmpW( szTemp, szDest )) break; /* nothing expanded */
}
+ if (SUCCEEDED(hr)) strcpyW(szTemp, szDest);
}
end:
#ifndef __REACTOS__
@@ -2092,7 +2099,8 @@ HRESULT WINAPI SHGetFolderPathAndSubDirA(
HRESULT hr = S_OK;
LPWSTR pszSubPathW = NULL;
LPWSTR pszPathW = NULL;
- TRACE("%08x,%08x,%s\n",nFolder, dwFlags, debugstr_w(pszSubPathW));
+
+ TRACE("%p,%#x,%p,%#x,%s,%p\n", hwndOwner, nFolder, hToken, dwFlags,
debugstr_a(pszSubPath), pszPath);
if(pszPath) {
pszPathW = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
@@ -2145,7 +2153,7 @@ HRESULT WINAPI SHGetFolderPathAndSubDirW(
CSIDL_Type type;
int ret;
- TRACE("%p,%p,nFolder=0x%04x,%s\n",
hwndOwner,pszPath,nFolder,debugstr_w(pszSubPath));
+ TRACE("%p,%#x,%p,%#x,%s,%p\n", hwndOwner, nFolder, hToken, dwFlags,
debugstr_w(pszSubPath), pszPath);
/* Windows always NULL-terminates the resulting path regardless of success
* or failure, so do so first
@@ -2153,7 +2161,7 @@ HRESULT WINAPI SHGetFolderPathAndSubDirW(
if (pszPath)
*pszPath = '\0';
- if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0]))
+ if (folder >= ARRAY_SIZE(CSIDL_Data))
return E_INVALIDARG;
if ((SHGFP_TYPE_CURRENT != dwFlags) && (SHGFP_TYPE_DEFAULT != dwFlags))
return E_INVALIDARG;
@@ -2317,7 +2325,7 @@ HRESULT WINAPI SHGetFolderPathA(
WCHAR szTemp[MAX_PATH];
HRESULT hr;
- TRACE("%p,%p,nFolder=0x%04x\n",hwndOwner,pszPath,nFolder);
+ TRACE("%p,%d,%p,%#x,%p\n", hwndOwner, nFolder, hToken, dwFlags, pszPath);
if (pszPath)
*pszPath = '\0';
@@ -2486,7 +2494,7 @@ static HRESULT _SHRegisterUserShellFolders(BOOL bDefault)
}
hr = _SHRegisterFolders(hRootKey, hToken, pUserShellFolderPath,
- pShellFolderPath, folders, sizeof(folders) / sizeof(folders[0]));
+ pShellFolderPath, folders, ARRAY_SIZE(folders));
TRACE("returning 0x%08x\n", hr);
return hr;
}
@@ -2511,7 +2519,7 @@ static HRESULT _SHRegisterCommonShellFolders(void)
TRACE("\n");
hr = _SHRegisterFolders(HKEY_LOCAL_MACHINE, NULL, szSHUserFolders,
- szSHFolders, folders, sizeof(folders) / sizeof(folders[0]));
+ szSHFolders, folders, ARRAY_SIZE(folders));
TRACE("returning 0x%08x\n", hr);
return hr;
}