[PATCH] start: Try cycling through extensions if original path failed to execute.
Nikolay Sivov
nsivov at codeweavers.com
Wed Oct 24 06:32:14 CDT 2018
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
programs/start/start.c | 50 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/programs/start/start.c b/programs/start/start.c
index 32372ecc34..ccec9bc1f9 100644
--- a/programs/start/start.c
+++ b/programs/start/start.c
@@ -403,7 +403,55 @@ int wmain (int argc, WCHAR *argv[])
}
if (!ShellExecuteExW(&sei))
- fatal_string_error(STRING_EXECFAIL, GetLastError(), sei.lpFile);
+ {
+ static const WCHAR pathextW[] = {'P','A','T','H','E','X','T',0};
+ const WCHAR *filename = sei.lpFile;
+ DWORD size, filename_len;
+ WCHAR *name, *env;
+
+ size = GetEnvironmentVariableW(pathextW, NULL, 0);
+ if (size)
+ {
+ WCHAR *start, *ptr;
+
+ env = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
+ if (!env)
+ fatal_string_error(STRING_EXECFAIL, ERROR_OUTOFMEMORY, sei.lpFile);
+ GetEnvironmentVariableW(pathextW, env, size);
+
+ filename_len = strlenW(filename);
+ name = HeapAlloc(GetProcessHeap(), 0, (filename_len + size) * sizeof(WCHAR));
+ if (!name)
+ fatal_string_error(STRING_EXECFAIL, ERROR_OUTOFMEMORY, sei.lpFile);
+
+ sei.lpFile = name;
+ start = env;
+ while ((ptr = strchrW(start, ';')))
+ {
+ if (start == ptr)
+ {
+ start = ptr + 1;
+ continue;
+ }
+
+ strcpyW(name, filename);
+ memcpy(&name[filename_len], start, (ptr - start) * sizeof(WCHAR));
+ name[filename_len + (ptr - start)] = 0;
+
+ if (ShellExecuteExW(&sei))
+ {
+ HeapFree(GetProcessHeap(), 0, name);
+ HeapFree(GetProcessHeap(), 0, env);
+ goto done;
+ }
+
+ start = ptr + 1;
+ }
+
+ }
+
+ fatal_string_error(STRING_EXECFAIL, GetLastError(), filename);
+ }
done:
HeapFree( GetProcessHeap(), 0, args );
--
2.19.1
More information about the wine-devel
mailing list