<div dir="ltr">This needs more changes, please disregard this series.<div>Sorry for the noise.<br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Op di 26 nov. 2019 om 18:06 schreef Gijs Vermeulen <<a href="mailto:gijsvrm@codeweavers.com" target="_blank">gijsvrm@codeweavers.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Signed-off-by: Gijs Vermeulen <<a href="mailto:gijsvrm@codeweavers.com" target="_blank">gijsvrm@codeweavers.com</a>><br>
---<br>
dlls/shell32/tests/shellpath.c | 131 +++++++++++++++++++++++++++++++++<br>
1 file changed, 131 insertions(+)<br>
<br>
diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c<br>
index 262714a9f3..e9dcf2da8c 100644<br>
--- a/dlls/shell32/tests/shellpath.c<br>
+++ b/dlls/shell32/tests/shellpath.c<br>
@@ -99,6 +99,7 @@ static HRESULT (WINAPI *pSHSetKnownFolderPath)(REFKNOWNFOLDERID, DWORD, HANDLE,<br>
static HRESULT (WINAPI *pSHGetFolderPathEx)(REFKNOWNFOLDERID, DWORD, HANDLE, LPWSTR, DWORD);<br>
static BOOL (WINAPI *pPathYetAnotherMakeUniqueName)(PWSTR, PCWSTR, PCWSTR, PCWSTR);<br>
static HRESULT (WINAPI *pSHGetKnownFolderIDList)(REFKNOWNFOLDERID, DWORD, HANDLE, PIDLIST_ABSOLUTE*);<br>
+static BOOL (WINAPI *pPathResolve)(PWSTR, PZPCWSTR, UINT);<br>
<br>
static DLLVERSIONINFO shellVersion = { 0 };<br>
static LPMALLOC pMalloc;<br>
@@ -207,6 +208,7 @@ static void loadShell32(void)<br>
GET_PROC(SHGetMalloc)<br>
GET_PROC(PathYetAnotherMakeUniqueName)<br>
GET_PROC(SHGetKnownFolderIDList)<br>
+ GET_PROC(PathResolve);<br>
<br>
ok(pSHGetMalloc != NULL, "shell32 is missing SHGetMalloc\n");<br>
if (pSHGetMalloc)<br>
@@ -2864,6 +2866,134 @@ if (0) { /* crashes on native */<br>
ILFree(pidl);<br>
}<br>
<br>
+static void test_PathResolve(void)<br>
+{<br>
+ WCHAR testfile[MAX_PATH], testfile_lnk[MAX_PATH], regedit_in_testdir[MAX_PATH], regedit_cmd[MAX_PATH];<br>
+ WCHAR prev_dir[MAX_PATH], tempdir[MAX_PATH], path[MAX_PATH];<br>
+ const WCHAR *dirs[2] = { tempdir, NULL };<br>
+ HANDLE file, file2;<br>
+ BOOL ret;<br>
+ int i;<br>
+ struct {<br>
+ const WCHAR *path;<br>
+ UINT flags;<br>
+ BOOL expected;<br>
+ const WCHAR *expected_path;<br>
+ } tests[] = {<br>
+ /* no flags */<br>
+ { L"test", 0, FALSE, L"test" },<br>
+ { L"..\\test", 0, TRUE, L"C:\\test" },<br>
+ { L".\\test", 0, TRUE, L"C:\\test" },<br>
+ { L"test\\test", 0, TRUE, L"C:\\test\\test" },<br>
+ { L"C:\\test", 0, TRUE, L"C:\\test" },<br>
+ { L"regedit", 0, FALSE, L"regedit" },<br>
+ { testfile, 0, TRUE, testfile },<br>
+<br>
+ /* PRF_VERIFYEXISTS */<br>
+ { L"test", PRF_VERIFYEXISTS, TRUE, testfile_lnk },<br>
+ { L"C:\\test", PRF_VERIFYEXISTS, FALSE, L"C:\\test" },<br>
+ /* common extensions are tried even if PRF_TRYPROGRAMEXTENSIONS isn't passed */<br>
+ /* directories in dirs parameter are always searched first even if PRF_FIRSTDIRDEF isn't passed */<br>
+ { L"regedit", PRF_VERIFYEXISTS, TRUE, regedit_cmd },<br>
+ /* .dll is not tried */<br>
+ { L"bcrypt", PRF_VERIFYEXISTS, FALSE, L"bcrypt" },<br>
+ { testfile, PRF_VERIFYEXISTS, TRUE, testfile_lnk },<br>
+ { regedit_in_testdir, PRF_VERIFYEXISTS, TRUE, regedit_cmd },<br>
+<br>
+ /* PRF_FIRSTDIRDEF */<br>
+ { L"regedit", PRF_FIRSTDIRDEF, FALSE, L"regedit" },<br>
+<br>
+ /* RF_VERIFYEXISTS | PRF_FIRSTDIRDEF */<br>
+ { L"regedit", PRF_VERIFYEXISTS | PRF_FIRSTDIRDEF, TRUE, regedit_cmd },<br>
+<br>
+ /* PRF_DONTFINDLNK */<br>
+ { testfile, PRF_DONTFINDLNK, TRUE, testfile },<br>
+ { regedit_in_testdir, PRF_DONTFINDLNK, TRUE, regedit_in_testdir },<br>
+<br>
+ /* RF_VERIFYEXISTS | PRF_DONTFINDLNK */<br>
+ { testfile, PRF_VERIFYEXISTS | PRF_DONTFINDLNK, FALSE, testfile },<br>
+ /* cmd is also ignored when passing PRF_VERIFYEXISTS | PRF_DONTFINDLNK */<br>
+ { regedit_in_testdir, PRF_VERIFYEXISTS | PRF_DONTFINDLNK, FALSE, regedit_in_testdir },<br>
+<br>
+ /* PRF_REQUIREABSOLUTE */<br>
+ /* seems to be ignored */<br>
+ { L"..\\test", PRF_REQUIREABSOLUTE, TRUE, L"C:\\test" },<br>
+ { L".\\test", PRF_REQUIREABSOLUTE, TRUE, L"C:\\test" },<br>
+ { L"test\\test", PRF_REQUIREABSOLUTE, TRUE, L"C:\\test\\test" },<br>
+ { L"C:\\test", PRF_REQUIREABSOLUTE, TRUE, L"C:\\test" },<br>
+<br>
+ /* PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE */<br>
+ /* only PRF_VERIFYEXISTS matters*/<br>
+ { L"test", PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE, TRUE, testfile_lnk },<br>
+ { L"C:\\test", PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE, FALSE, L"C:\\test" },<br>
+ { L"regedit", PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE, TRUE, regedit_cmd },<br>
+ { testfile, PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE, TRUE, testfile_lnk },<br>
+<br>
+ /* PRF_TRYPROGRAMEXTENSIONS */<br>
+ { L"test", PRF_TRYPROGRAMEXTENSIONS, TRUE, testfile_lnk},<br>
+ { L"C:\\test", PRF_TRYPROGRAMEXTENSIONS, FALSE, L"C:\\test" },<br>
+ { L"regedit", PRF_TRYPROGRAMEXTENSIONS, TRUE, regedit_cmd },<br>
+ /* .dll is not tried */<br>
+ { L"bcrypt", PRF_TRYPROGRAMEXTENSIONS, FALSE, L"bcrypt" },<br>
+ { testfile, PRF_TRYPROGRAMEXTENSIONS, TRUE, testfile_lnk },<br>
+ { regedit_in_testdir, PRF_TRYPROGRAMEXTENSIONS, TRUE, regedit_cmd },<br>
+<br>
+ /* PRF_TRYPROGRAMEXTENSIONS | PRF_DONTFINDLNK */<br>
+ { testfile, PRF_TRYPROGRAMEXTENSIONS | PRF_DONTFINDLNK, FALSE, testfile },<br>
+ /* cmd is also ignored when passing PRF_TRYPROGRAMEXTENSIONS | PRF_DONTFINDLNK */<br>
+ { regedit_in_testdir, PRF_TRYPROGRAMEXTENSIONS | PRF_DONTFINDLNK, FALSE, regedit_in_testdir }<br>
+ };<br>
+<br>
+ if (!pPathResolve)<br>
+ {<br>
+ win_skip("PathResolve not available\n");<br>
+ return;<br>
+ }<br>
+<br>
+ GetCurrentDirectoryW(MAX_PATH, prev_dir);<br>
+ SetCurrentDirectoryW(L"C:");<br>
+<br>
+ GetTempPathW(MAX_PATH, tempdir);<br>
+<br>
+ lstrcpyW(testfile, tempdir);<br>
+ lstrcatW(testfile, L"test");<br>
+ lstrcpyW(testfile_lnk, testfile);<br>
+ lstrcatW(testfile_lnk, L".lnk");<br>
+<br>
+ file = CreateFileW(testfile_lnk, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);<br>
+ ok(file != INVALID_HANDLE_VALUE, "got %p\n", file);<br>
+<br>
+ lstrcpyW(regedit_in_testdir, tempdir);<br>
+ lstrcatW(regedit_in_testdir, L"regedit");<br>
+ lstrcpyW(regedit_cmd, regedit_in_testdir);<br>
+ lstrcatW(regedit_cmd, L".cmd");<br>
+<br>
+ file2 = CreateFileW(regedit_cmd, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);<br>
+ ok(file2 != INVALID_HANDLE_VALUE, "got %p\n", file);<br>
+<br>
+ /* show that resolving regedit with NULL dirs returns regedit.exe */<br>
+ lstrcpyW(path, L"regedit");<br>
+ ret = pPathResolve(path, NULL, PRF_VERIFYEXISTS);<br>
+ ok(ret, "resolving regedit failed unexpectedly\n");<br>
+ ok(!lstrcmpiW(path, L"C:\\windows\\regedit.exe") || !lstrcmpiW(path, L"C:\\windows\\system32\\regedit.exe"),<br>
+ "unexpected path %s\n", wine_dbgstr_w(path));<br>
+<br>
+ for (i = 0; i < ARRAY_SIZE(tests); i++)<br>
+ {<br>
+ lstrcpyW(path, tests[i].path);<br>
+<br>
+ if (!tests[i].expected) SetLastError(0xdeadbeef);<br>
+ ret = pPathResolve(path, dirs, tests[i].flags);<br>
+ ok(ret == tests[i].expected, "test %d: expected %d, got %d\n", i, tests[i].expected, ret);<br>
+ ok(!lstrcmpiW(path, tests[i].expected_path),<br>
+ "test %d: expected %s, got %s\n", i, wine_dbgstr_w(tests[i].expected_path), wine_dbgstr_w(path));<br>
+ }<br>
+<br>
+ CloseHandle(file);<br>
+ CloseHandle(file2);<br>
+ SetCurrentDirectoryW(prev_dir);<br>
+}<br>
+<br>
START_TEST(shellpath)<br>
{<br>
if (!init()) return;<br>
@@ -2894,5 +3024,6 @@ START_TEST(shellpath)<br>
test_DoEnvironmentSubst();<br>
test_PathYetAnotherMakeUniqueName();<br>
test_SHGetKnownFolderIDList();<br>
+ test_PathResolve();<br>
}<br>
}<br>
-- <br>
2.24.0<br>
<br>
<br>
</blockquote></div></div></div>