diff --git "a/dll/win32/shell32/shlexec.cpp" "b/dll/win32/shell32/shlexec.cpp" index 292c8db8292..de3c6094720 100644 --- "a/dll/win32/shell32/shlexec.cpp" +++ "b/dll/win32/shell32/shlexec.cpp" @@ -2124,6 +2124,40 @@ static BOOL SHELL_execute(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc) *end = L'\0'; lpFile = wfileName; } + else if (!PathIsDirectoryW(wszApplicationName) && + !PathIsExeW(wszApplicationName) && + (sei_tmp.fMask & SEE_MASK_INVOKEIDLIST) != SEE_MASK_INVOKEIDLIST && + (sei_tmp.fMask & SEE_MASK_HASLINKNAME) != SEE_MASK_HASLINKNAME) + { + /* If the executable name is not quoted, we have to use this search loop here, + that in CreateProcess() is not sufficient because it does not handle shell links. */ + WCHAR buffer[MAX_PATH], xlpFile[MAX_PATH]; + LPWSTR space, s; + + LPWSTR beg = wszApplicationName/*sei_tmp.lpFile*/; + for(s = beg; (space = const_cast(strchrW(s, L' '))); s = space + 1) + { + int idx = space - sei_tmp.lpFile; + memcpy(buffer, sei_tmp.lpFile, idx * sizeof(WCHAR)); + buffer[idx] = '\0'; + + /*FIXME This finds directory paths if the targeted file name contains spaces. */ + if (SearchPathW(*sei_tmp.lpDirectory ? sei_tmp.lpDirectory : NULL, buffer, L".exe", sizeof(xlpFile) / sizeof(xlpFile[0]), xlpFile, NULL)) + { + /* separate out command from parameter string */ + LPCWSTR p = space + 1; + + while(isspaceW(*p)) + ++p; + + strcpyW(wszParameters, p); + *space = L'\0'; + + break; + } + } + lpFile = sei_tmp.lpFile; + } else { lpFile = sei_tmp.lpFile;