https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9dfb3e8e051388f765de20bc259e71276ad15eb6
commit 9dfb3e8e051388f765de20bc259e71276ad15eb6 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Sat Oct 28 09:59:12 2023 +0900 Commit: GitHub <nore...@github.com> CommitDate: Sat Oct 28 09:59:12 2023 +0900 [SHELL32][SDK] Implement PathIsSlowA and SHSetFolderPathA (#5841) - Implement PathIsSlowA and SHSetFolderPathA functions. - Add PathIsSlow and SHSetFolderPath prototypes to <shlobj.h>. - Fix some <shlobj.h>'s bugs. - Improve SHOpenPropSheetA function. --- dll/win32/shell32/stubs.cpp | 42 +++++++------------------- dll/win32/shell32/utils.cpp | 73 ++++++++++++++++++++++++++++++++++----------- sdk/include/psdk/shlobj.h | 43 ++++++++++++++++++++++---- 3 files changed, 103 insertions(+), 55 deletions(-) diff --git a/dll/win32/shell32/stubs.cpp b/dll/win32/shell32/stubs.cpp index ad3f31c2873..56480aae5bd 100644 --- a/dll/win32/shell32/stubs.cpp +++ b/dll/win32/shell32/stubs.cpp @@ -225,13 +225,13 @@ SHGetSetFolderCustomSettingsA(LPSHFOLDERCUSTOMSETTINGSA pfcs, */ BOOL WINAPI SHOpenPropSheetW( - _In_opt_z_ LPCWSTR pszCaption, + _In_opt_ LPCWSTR pszCaption, _In_opt_ HKEY *ahKeys, _In_ UINT cKeys, _In_ const CLSID *pclsidDefault, _In_ IDataObject *pDataObject, _In_opt_ IShellBrowser *pShellBrowser, - _In_opt_z_ LPCWSTR pszStartPage) + _In_opt_ LPCWSTR pszStartPage) { FIXME("SHOpenPropSheetW() stub\n"); return FALSE; @@ -1028,24 +1028,11 @@ FirstUserLogon(LPWSTR lpUnknown1, LPWSTR lpUnknown2) */ EXTERN_C HRESULT WINAPI -SHSetFolderPathA(int csidl, - HANDLE hToken, - DWORD dwFlags, - LPCSTR pszPath) -{ - FIXME("SHSetFolderPathA() stub\n"); - return E_FAIL; -} - -/* - * Unimplemented - */ -EXTERN_C HRESULT -WINAPI -SHSetFolderPathW(int csidl, - HANDLE hToken, - DWORD dwFlags, - LPCWSTR pszPath) +SHSetFolderPathW( + _In_ INT csidl, + _In_ HANDLE hToken, + _In_ DWORD dwFlags, + _In_ LPCWSTR pszPath) { FIXME("SHSetFolderPathW() stub\n"); return E_FAIL; @@ -1089,23 +1076,14 @@ SHShouldShowWizards(LPVOID lpUnknown) */ EXTERN_C BOOL WINAPI -PathIsSlowW(LPCWSTR pszFile, DWORD dwFileAttr) +PathIsSlowW( + _In_ LPCWSTR pszFile, + _In_ DWORD dwAttr) { FIXME("PathIsSlowW() stub\n"); return FALSE; } -/* - * Unimplemented - */ -EXTERN_C BOOL -WINAPI -PathIsSlowA(LPCSTR pszFile, DWORD dwFileAttr) -{ - FIXME("PathIsSlowA() stub\n"); - return FALSE; -} - /* * Unimplemented */ diff --git a/dll/win32/shell32/utils.cpp b/dll/win32/shell32/utils.cpp index c9170ff29af..6adeca8afd7 100644 --- a/dll/win32/shell32/utils.cpp +++ b/dll/win32/shell32/utils.cpp @@ -9,7 +9,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); -static BOOL OpenEffectiveToken(DWORD DesiredAccess, HANDLE *phToken) +static BOOL +OpenEffectiveToken( + _In_ DWORD DesiredAccess, + _Out_ HANDLE *phToken) { BOOL ret; @@ -28,6 +31,40 @@ static BOOL OpenEffectiveToken(DWORD DesiredAccess, HANDLE *phToken) return ret; } +/************************************************************************* + * SHSetFolderPathA (SHELL32.231) + * + * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shsetfolderpatha + */ +EXTERN_C +HRESULT WINAPI +SHSetFolderPathA( + _In_ INT csidl, + _In_ HANDLE hToken, + _In_ DWORD dwFlags, + _In_ LPCSTR pszPath) +{ + TRACE("(%d, %p, 0x%X, %s)\n", csidl, hToken, dwFlags, debugstr_a(pszPath)); + CStringW strPathW(pszPath); + return SHSetFolderPathW(csidl, hToken, dwFlags, strPathW); +} + +/************************************************************************* + * PathIsSlowA (SHELL32.240) + * + * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-pathisslowa + */ +EXTERN_C +BOOL WINAPI +PathIsSlowA( + _In_ LPCSTR pszFile, + _In_ DWORD dwAttr) +{ + TRACE("(%s, 0x%X)\n", debugstr_a(pszFile), dwAttr); + CStringW strFileW(pszFile); + return PathIsSlowW(strFileW, dwAttr); +} + /************************************************************************* * SHOpenEffectiveToken (SHELL32.235) */ @@ -68,7 +105,7 @@ EXTERN_C DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken) EXTERN_C HRESULT WINAPI SHInvokePrivilegedFunctionW( - _In_z_ LPCWSTR pszName, + _In_ LPCWSTR pszName, _In_ PRIVILEGED_FUNCTION fn, _In_opt_ LPARAM lParam) { @@ -110,7 +147,9 @@ SHInvokePrivilegedFunctionW( */ EXTERN_C BOOL WINAPI -SHTestTokenPrivilegeW(_In_opt_ HANDLE hToken, _In_z_ LPCWSTR lpName) +SHTestTokenPrivilegeW( + _In_opt_ HANDLE hToken, + _In_ LPCWSTR lpName) { LUID Luid; DWORD dwLength; @@ -314,7 +353,7 @@ SHFindComputer(LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidlSavedSearch) static HRESULT Int64ToStr( _In_ LONGLONG llValue, - _Out_writes_z_(cchValue) LPWSTR pszValue, + _Out_writes_(cchValue) LPWSTR pszValue, _In_ UINT cchValue) { WCHAR szBuff[40]; @@ -361,9 +400,9 @@ Int64GetNumFormat( _Out_ NUMBERFMTW *pDest, _In_opt_ const NUMBERFMTW *pSrc, _In_ DWORD dwNumberFlags, - _Out_writes_z_(cchDecimal) LPWSTR pszDecimal, + _Out_writes_(cchDecimal) LPWSTR pszDecimal, _In_ INT cchDecimal, - _Out_writes_z_(cchThousand) LPWSTR pszThousand, + _Out_writes_(cchThousand) LPWSTR pszThousand, _In_ INT cchThousand) { WCHAR szBuff[20]; @@ -419,7 +458,7 @@ EXTERN_C INT WINAPI Int64ToString( _In_ LONGLONG llValue, - _Out_writes_z_(cchOut) LPWSTR pszOut, + _Out_writes_(cchOut) LPWSTR pszOut, _In_ UINT cchOut, _In_ BOOL bUseFormat, _In_opt_ const NUMBERFMTW *pNumberFormat, @@ -457,7 +496,7 @@ EXTERN_C INT WINAPI LargeIntegerToString( _In_ const LARGE_INTEGER *pLargeInt, - _Out_writes_z_(cchOut) LPWSTR pszOut, + _Out_writes_(cchOut) LPWSTR pszOut, _In_ UINT cchOut, _In_ BOOL bUseFormat, _In_opt_ const NUMBERFMTW *pNumberFormat, @@ -475,30 +514,30 @@ LargeIntegerToString( EXTERN_C BOOL WINAPI SHOpenPropSheetA( - _In_opt_z_ LPCSTR pszCaption, + _In_opt_ LPCSTR pszCaption, _In_opt_ HKEY *ahKeys, _In_ UINT cKeys, _In_ const CLSID *pclsidDefault, _In_ IDataObject *pDataObject, _In_opt_ IShellBrowser *pShellBrowser, - _In_opt_z_ LPCSTR pszStartPage) + _In_opt_ LPCSTR pszStartPage) { - WCHAR szStartPageW[MAX_PATH], szCaptionW[MAX_PATH]; + CStringW strStartPageW, strCaptionW; LPCWSTR pszCaptionW = NULL, pszStartPageW = NULL; - TRACE("(%s, %p, %u, %p, %p, %p, %s)", pszCaption, ahKeys, cKeys, pclsidDefault, pDataObject, - pShellBrowser, pszStartPage); + TRACE("(%s, %p, %u, %p, %p, %p, %s)", debugstr_a(pszCaption), ahKeys, cKeys, pclsidDefault, + pDataObject, pShellBrowser, debugstr_a(pszStartPage)); if (pszCaption) { - SHAnsiToUnicode(pszCaption, szCaptionW, _countof(szCaptionW)); - pszCaptionW = szCaptionW; + strStartPageW = pszCaption; + pszCaptionW = strCaptionW; } if (pszStartPage) { - SHAnsiToUnicode(pszStartPage, szStartPageW, _countof(szStartPageW)); - pszStartPageW = szStartPageW; + strStartPageW = pszStartPage; + pszStartPageW = strStartPageW; } return SHOpenPropSheetW(pszCaptionW, ahKeys, cKeys, pclsidDefault, diff --git a/sdk/include/psdk/shlobj.h b/sdk/include/psdk/shlobj.h index 39124f6af41..a9c90ffc137 100644 --- a/sdk/include/psdk/shlobj.h +++ b/sdk/include/psdk/shlobj.h @@ -190,7 +190,35 @@ SHGetFolderPathAndSubDirW( _In_opt_ LPCWSTR, _Out_writes_(MAX_PATH) LPWSTR); -#define SHGetFolderPathAndSubDir WINELIB_NAME_AW(SHGetFolderPathAndSubDir); +#define SHGetFolderPathAndSubDir WINELIB_NAME_AW(SHGetFolderPathAndSubDir) + +HRESULT WINAPI +SHSetFolderPathA( + _In_ INT csidl, + _In_ HANDLE hToken, + _In_ DWORD dwFlags, + _In_ LPCSTR pszPath); + +HRESULT WINAPI +SHSetFolderPathW( + _In_ INT csidl, + _In_ HANDLE hToken, + _In_ DWORD dwFlags, + _In_ LPCWSTR pszPath); + +#define SHSetFolderPath WINELIB_NAME_AW(SHSetFolderPath) + +BOOL WINAPI +PathIsSlowA( + _In_ LPCSTR pszFile, + _In_ DWORD dwAttr); + +BOOL WINAPI +PathIsSlowW( + _In_ LPCWSTR pszFile, + _In_ DWORD dwAttr); + +#define PathIsSlow WINELIB_NAME_AW(PathIsSlow) _Success_(return != 0) BOOL @@ -242,7 +270,7 @@ SHPathPrepareForWriteW( _In_opt_ IUnknown*, _In_ LPCWSTR, DWORD); -#define SHPathPrepareForWrite WINELIB_NAME_AW(SHPathPrepareForWrite); +#define SHPathPrepareForWrite WINELIB_NAME_AW(SHPathPrepareForWrite) UINT WINAPI @@ -342,22 +370,25 @@ HINSTANCE WINAPI SHGetShellStyleHInstance(VOID); BOOL WINAPI SHOpenPropSheetA( - _In_opt_z_ LPCSTR pszCaption, + _In_opt_ LPCSTR pszCaption, _In_opt_ HKEY *ahKeys, _In_ UINT cKeys, _In_ const CLSID *pclsidDefault, _In_ IDataObject *pDataObject, _In_opt_ IShellBrowser *pShellBrowser, - _In_opt_z_ LPCSTR pszStartPage); + _In_opt_ LPCSTR pszStartPage); + BOOL WINAPI SHOpenPropSheetW( - _In_opt_z_ LPCWSTR pszCaption, + _In_opt_ LPCWSTR pszCaption, _In_opt_ HKEY *ahKeys, _In_ UINT cKeys, _In_ const CLSID *pclsidDefault, _In_ IDataObject *pDataObject, _In_opt_ IShellBrowser *pShellBrowser, - _In_opt_z_ LPCWSTR pszStartPage); + _In_opt_ LPCWSTR pszStartPage); + +#define SHOpenPropSheet WINELIB_NAME_AW(SHOpenPropSheet) /***************************************************************************** * IContextMenu interface