<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>