Module: wine Branch: stable Commit: b01a3d1da6a601479a315b418de2665cfaa5d724 URL: https://source.winehq.org/git/wine.git/?a=commit;h=b01a3d1da6a601479a315b418...
Author: Damjan Jovanovic damjan.jov@gmail.com Date: Sun Mar 22 13:46:23 2020 +0200
shell32: Pass the executable's full path from SHELL_execute() to CreateProcess().
Several older Microsoft installers, particularly those changing CDs during installation, break because they launch a child setup.exe, from a parent process also called setup.exe, which Wine finds in the wrong directory, as CreateProcess() first searches the parent executable's own directory, thus re-launching the parent itself instead of the child. Therefore CreateProcess() must be passed a full path from SHELL_execute(), so it launches the correct child.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=8439 Signed-off-by: Damjan Jovanovic damjan.jov@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 9736fe499d0887bf92652ca32ba5195e7b0b0e9c) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/shell32/shlexec.c | 8 ++++++++ dlls/shell32/tests/shlexec.c | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c index d3ff821135..ce0b8f6d2b 100644 --- a/dlls/shell32/shlexec.c +++ b/dlls/shell32/shlexec.c @@ -1807,6 +1807,14 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) lpFile = sei_tmp.lpFile; wcmd = wcmdBuffer; strcpyW(wcmd, wszApplicationName); + if (sei_tmp.lpDirectory) + { + LPCWSTR searchPath[] = { + sei_tmp.lpDirectory, + NULL + }; + PathFindOnPathW(wcmd, searchPath); + } retval = SHELL_quote_and_execute( wcmd, wszParameters, wszEmpty, wszApplicationName, NULL, &sei_tmp, sei, execfunc ); diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c index f881e96b6e..3f67a79960 100644 --- a/dlls/shell32/tests/shlexec.c +++ b/dlls/shell32/tests/shlexec.c @@ -2842,7 +2842,7 @@ static void test_directory(void) NULL, "test2.exe", params, tmpdir, NULL); okShell(rc > 32, "returned %lu\n", rc); okChildInt("argcA", 4); - todo_wine okChildString("argvA0", path); + okChildString("argvA0", path); okChildString("argvA3", "Exec"); okChildPath("longPath", path);
@@ -2855,7 +2855,7 @@ static void test_directory(void) NULL, "test2.exe", params, "%TMPDIR%", NULL); okShell(rc > 32, "returned %lu\n", rc); okChildInt("argcA", 4); - todo_wine okChildString("argvA0", path); + okChildString("argvA0", path); okChildString("argvA3", "Exec"); okChildPath("longPath", path);
@@ -2872,9 +2872,9 @@ static void test_directory(void) NULL, strrchr(argv0, '\') + 1, params, tmpdir, NULL); okShell(rc > 32, "returned %lu\n", rc); okChildInt("argcA", 4); - todo_wine okChildString("argvA0", path); + okChildString("argvA0", path); okChildString("argvA3", "Exec"); - todo_wine okChildPath("longPath", path); + okChildPath("longPath", path); DeleteFileA(path); }