shell32: Implement PathResolve.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48082
Signed-off-by: Gijs Vermeulen <gijsvrm@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
(cherry picked from commit a5a2749cfe)
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
oldstable
Gijs Vermeulen 2019-12-11 11:16:17 +01:00 committed by Michael Stefaniuc
parent bc846f4b8d
commit 2d6f581595
2 changed files with 61 additions and 11 deletions

View File

@ -684,27 +684,78 @@ BOOL WINAPI PathQualifyAW(LPCVOID pszPath)
return PathQualifyA(pszPath);
}
static BOOL PathResolveA(LPSTR path, LPCSTR *paths, DWORD flags)
BOOL WINAPI PathFindOnPathExA(LPSTR,LPCSTR *,DWORD);
BOOL WINAPI PathFindOnPathExW(LPWSTR,LPCWSTR *,DWORD);
BOOL WINAPI PathFileExistsDefExtA(LPSTR,DWORD);
BOOL WINAPI PathFileExistsDefExtW(LPWSTR,DWORD);
static BOOL PathResolveA(char *path, const char **dirs, DWORD flags)
{
FIXME("(%s,%p,0x%08x),stub!\n", debugstr_a(path), paths, flags);
return FALSE;
BOOL is_file_spec = PathIsFileSpecA(path);
DWORD dwWhich = flags & PRF_DONTFINDLNK ? 0xf : 0xff;
TRACE("(%s,%p,0x%08x)\n", debugstr_a(path), dirs, flags);
if (flags & PRF_VERIFYEXISTS && !PathFileExistsA(path))
{
if (PathFindOnPathExA(path, dirs, dwWhich))
return TRUE;
if (PathFileExistsDefExtA(path, dwWhich))
return TRUE;
if (!is_file_spec) GetFullPathNameA(path, MAX_PATH, path, NULL);
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
if (is_file_spec)
{
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
GetFullPathNameA(path, MAX_PATH, path, NULL);
return TRUE;
}
static BOOL PathResolveW(LPWSTR path, LPCWSTR *paths, DWORD flags)
static BOOL PathResolveW(WCHAR *path, const WCHAR **dirs, DWORD flags)
{
FIXME("(%s,%p,0x%08x),stub!\n", debugstr_w(path), paths, flags);
return FALSE;
BOOL is_file_spec = PathIsFileSpecW(path);
DWORD dwWhich = flags & PRF_DONTFINDLNK ? 0xf : 0xff;
TRACE("(%s,%p,0x%08x)\n", debugstr_w(path), dirs, flags);
if (flags & PRF_VERIFYEXISTS && !PathFileExistsW(path))
{
if (PathFindOnPathExW(path, dirs, dwWhich))
return TRUE;
if (PathFileExistsDefExtW(path, dwWhich))
return TRUE;
if (!is_file_spec) GetFullPathNameW(path, MAX_PATH, path, NULL);
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
if (is_file_spec)
{
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
GetFullPathNameW(path, MAX_PATH, path, NULL);
return TRUE;
}
/*************************************************************************
* PathResolve [SHELL32.51]
*/
BOOL WINAPI PathResolveAW(LPVOID path, LPCVOID *paths, DWORD flags)
BOOL WINAPI PathResolveAW(void *path, const void **paths, DWORD flags)
{
if (SHELL_OsIsUnicode())
return PathResolveW(path, (LPCWSTR*)paths, flags);
return PathResolveW(path, (const WCHAR **)paths, flags);
else
return PathResolveA(path, (LPCSTR*)paths, flags);
return PathResolveA(path, (const char **)paths, flags);
}
/*************************************************************************

View File

@ -1717,10 +1717,9 @@ BOOL WINAPI WriteCabinetState(CABINETSTATE *);
/* PathResolve flags */
#define PRF_VERIFYEXISTS 0x01
#define PRF_EXECUTABLE 0x02
#define PRF_TRYPROGRAMEXTENSIONS 0x03
#define PRF_FIRSTDIRDEF 0x04
#define PRF_DONTFINDLINK 0x08
#define PRF_DONTFINDLNK 0x08
#define PRF_REQUIREABSOLUTE 0x10
VOID WINAPI PathGetShortPath(LPWSTR pszPath);