[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