Implementing missing features...
JIRA issue: CORE-19278
- Implement PathFileExistsDefExtAndAttributesW function.
- Add its prototype to <shlwapi_undoc.h>.
- Modify shlwapi.spec.
- Add PathFileExistsDefExtAndAttributesW testcase.
508 stdcall -noname SHPropertyBag_WriteDWORD(ptr wstr long)
509 stdcall -noname IUnknown_OnFocusChangeIS(ptr ptr long)
510 stdcall -noname SHLockSharedEx(ptr long long)
-511 stdcall -stub -noname PathFileExistsDefExtAndAttributesW(wstr long ptr)
+511 stdcall -noname PathFileExistsDefExtAndAttributesW(wstr long ptr)
512 stub -ordinal IStream_ReadPidl
513 stub -ordinal IStream_WritePidl
514 stdcall -noname IUnknown_ProfferService(ptr ptr ptr ptr)
return ret;
}
+
+/*************************************************************************
+ * PathFileExistsDefExtAndAttributesW [SHLWAPI.511]
+ *
+ * @param pszPath The path string.
+ * @param dwWhich The WHICH_... flags.
+ * @param pdwFileAttributes A pointer to the file attributes. Optional.
+ * @return TRUE if successful.
+ */
+BOOL WINAPI
+PathFileExistsDefExtAndAttributesW(
+ _Inout_ LPWSTR pszPath,
+ _In_ DWORD dwWhich,
+ _Out_opt_ LPDWORD pdwFileAttributes)
+{
+ TRACE("(%s, 0x%lX, %p)\n", debugstr_w(pszPath), dwWhich, pdwFileAttributes);
+
+ if (pdwFileAttributes)
+ *pdwFileAttributes = INVALID_FILE_ATTRIBUTES;
+
+ if (!pszPath)
+ return FALSE;
+
+ if (!dwWhich || (*PathFindExtensionW(pszPath) && (dwWhich & WHICH_OPTIONAL)))
+ return PathFileExistsAndAttributesW(pszPath, pdwFileAttributes);
+
+ if (!PathFileExistsDefExtW(pszPath, dwWhich))
+ {
+ if (pdwFileAttributes)
+ *pdwFileAttributes = INVALID_FILE_ATTRIBUTES;
+ return FALSE;
+ }
+
+ if (pdwFileAttributes)
+ *pdwFileAttributes = GetFileAttributesW(pszPath);
+
+ return TRUE;
+}
list(APPEND SOURCE
AssocQueryString.c
+ PathFileExistsDefExtAndAttributesW.c
PathFindOnPath.c
PathIsUNC.c
PathIsUNCServer.c
--- /dev/null
+/*
+ * PROJECT: ReactOS api tests
+ * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
+ * PURPOSE: Tests for PathFileExistsDefExtAndAttributesW
+ * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
+ */
+
+#include <apitest.h>
+#include <shlobj.h>
+#include <shlwapi.h>
+#include <shlwapi_undoc.h>
+
+START_TEST(PathFileExistsDefExtAndAttributesW)
+{
+ WCHAR szPath[MAX_PATH];
+ DWORD attrs;
+ BOOL ret;
+
+ /* NULL check */
+ ret = PathFileExistsDefExtAndAttributesW(NULL, 0, NULL);
+ ok_int(ret, FALSE);
+
+ /* Not existent file */
+ lstrcpynW(szPath, L"Not Existent File.txt", _countof(szPath));
+ ret = PathFileExistsDefExtAndAttributesW(szPath, 0, NULL);
+ ok_int(ret, FALSE);
+
+ /* "Windows" directory */
+ GetWindowsDirectoryW(szPath, _countof(szPath));
+ ret = PathFileExistsDefExtAndAttributesW(szPath, 0, NULL);
+ ok_int(ret, TRUE);
+
+ /* "Windows" directory with attributes check */
+ attrs = 0;
+ ret = PathFileExistsDefExtAndAttributesW(szPath, 0, &attrs);
+ ok_int(ret, TRUE);
+ ok(attrs != 0 && attrs != INVALID_FILE_ATTRIBUTES, "attrs was 0x%lX\n", attrs);
+
+ /* Find notepad.exe */
+ SearchPathW(NULL, L"notepad.exe", NULL, _countof(szPath), szPath, NULL);
+ ret = PathFileExistsW(szPath);
+ ok_int(ret, TRUE);
+
+ /* Remove .exe */
+ PathRemoveExtensionW(szPath);
+ ret = PathFileExistsW(szPath);
+ ok_int(ret, FALSE);
+
+ /* Add .exe */
+ ret = PathFileExistsDefExtAndAttributesW(szPath, WHICH_EXE, NULL);
+ ok_int(ret, TRUE);
+ ret = PathFileExistsW(szPath);
+ ok_int(ret, TRUE);
+
+ /* notepad.cmd doesn't exist */
+ PathRemoveExtensionW(szPath);
+ ret = PathFileExistsDefExtAndAttributesW(szPath, WHICH_CMD, NULL);
+ ok_int(ret, FALSE);
+ ret = PathFileExistsW(szPath);
+ ok_int(ret, FALSE);
+}
#include <apitest.h>
extern void func_AssocQueryString(void);
+extern void func_PathFileExistsDefExtAndAttributesW(void);
extern void func_PathFindOnPath(void);
extern void func_isuncpath(void);
extern void func_isuncpathserver(void);
const struct test winetest_testlist[] =
{
{ "AssocQueryString", func_AssocQueryString },
+ { "PathFileExistsDefExtAndAttributesW", func_PathFileExistsDefExtAndAttributesW },
{ "PathFindOnPath", func_PathFindOnPath },
{ "PathIsUNC", func_isuncpath },
{ "PathIsUNCServer", func_isuncpathserver },
_In_ UINT fuStyle,
...);
-/* dwWhich flags for PathFileExistsDefExtW and PathFindOnPathExW */
+/* dwWhich flags for PathFileExistsDefExtW, PathFindOnPathExW,
+ * and PathFileExistsDefExtAndAttributesW */
#define WHICH_PIF (1 << 0)
#define WHICH_COM (1 << 1)
#define WHICH_EXE (1 << 2)
#define PATH_CHAR_CLASS_ANY 0xffffffff
BOOL WINAPI PathFileExistsDefExtW(LPWSTR lpszPath, DWORD dwWhich);
+
+BOOL WINAPI
+PathFileExistsDefExtAndAttributesW(
+ _Inout_ LPWSTR pszPath,
+ _In_ DWORD dwWhich,
+ _Out_opt_ LPDWORD pdwFileAttributes);
+
BOOL WINAPI PathFindOnPathExW(LPWSTR lpszFile, LPCWSTR *lppszOtherDirs, DWORD dwWhich);
VOID WINAPI FixSlashesAndColonW(LPWSTR);
BOOL WINAPI PathIsValidCharA(char c, DWORD dwClass);