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'};
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__
#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__
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);
return E_FAIL;
}
+ dwPathLen = MAX_PATH * sizeof(WCHAR);
if (!RegQueryValueExW(userShellFolderKey, value, NULL, &dwType,
(LPBYTE)path, &dwPathLen) && (dwType == REG_EXPAND_SZ || dwType == REG_SZ))
{
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;
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);
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;
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;
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;
/* 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 );
}
strcpyW(szDest, szProfilesPrefix);
hr = _SHGetProfilesValue(key, AllUsersProfileValueW,
- szAllUsers, AllUsersW);
+ szAllUsers, AllUsersW);
PathAppendW(szDest, szAllUsers);
#else
DWORD cchSize = cchDest;
#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__
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
#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__
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));
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
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;
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';
}
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;
}
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;
}