shell32: Supply a module name to CreateProcess (try 4)

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Wed Mar 12 00:33:57 CDT 2014


Hi,
Return an error when FindExecutable fails

Changelog:
        shell32: Supply a module name to CreateProcess


Best Regards
     Alistair Leslie-Hughes



-------------- next part --------------
>From 12cc35599bcf08e2c36bb4a50b3af89e91a5c09a Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Sat, 22 Feb 2014 15:52:56 +1100
Subject: [PATCH] Supply a module name to CreateProcess
To: wine-patches <wine-patches at winehq.org>

---
 dlls/shell32/shlexec.c | 21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c
index 39d640a..b9d8df5 100644
--- a/dlls/shell32/shlexec.c
+++ b/dlls/shell32/shlexec.c
@@ -311,10 +311,10 @@ static UINT_PTR SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
     STARTUPINFOW  startup;
     PROCESS_INFORMATION info;
     UINT_PTR retval = SE_ERR_NOASSOC;
-    UINT gcdret = 0;
-    WCHAR curdir[MAX_PATH];
     DWORD dwCreationFlags;
     const WCHAR *lpDirectory = NULL;
+    WCHAR module_path[MAX_PATH] = {0};
+    HINSTANCE findexec;
 
     TRACE("Execute %s from directory %s\n", debugstr_w(lpCmd), debugstr_w(psei->lpDirectory));
 
@@ -327,12 +327,10 @@ static UINT_PTR SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
             lpDirectory = psei->lpDirectory;
     }
 
-    /* ShellExecute specifies the command from psei->lpDirectory
-     * if present. Not from the current dir as CreateProcess does */
-    if( lpDirectory )
-        if( ( gcdret = GetCurrentDirectoryW( MAX_PATH, curdir)))
-            if( !SetCurrentDirectoryW( lpDirectory))
-                ERR("cannot set directory %s\n", debugstr_w(lpDirectory));
+    findexec = FindExecutableW(psei->lpFile, lpDirectory, module_path);
+    if(!findexec)
+        return ERROR_FILE_NOT_FOUND;
+
     ZeroMemory(&startup,sizeof(STARTUPINFOW));
     startup.cb = sizeof(STARTUPINFOW);
     startup.dwFlags = STARTF_USESHOWWINDOW;
@@ -340,7 +338,7 @@ static UINT_PTR SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
     dwCreationFlags = CREATE_UNICODE_ENVIRONMENT;
     if (psei->fMask & SEE_MASK_NO_CONSOLE)
         dwCreationFlags |= CREATE_NEW_CONSOLE;
-    if (CreateProcessW(NULL, (LPWSTR)lpCmd, NULL, NULL, FALSE, dwCreationFlags, env,
+    if (CreateProcessW(module_path, (LPWSTR)lpCmd, NULL, NULL, FALSE, dwCreationFlags, env,
                        lpDirectory, &startup, &info))
     {
         /* Give 30 seconds to the app to come up, if desired. Probably only needed
@@ -363,11 +361,6 @@ static UINT_PTR SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
 
     TRACE("returning %lu\n", retval);
 
-    psei_out->hInstApp = (HINSTANCE)retval;
-    if( gcdret )
-        if( !SetCurrentDirectoryW( curdir))
-            ERR("cannot return to directory %s\n", debugstr_w(curdir));
-
     return retval;
 }
 
-- 
1.8.3.2



More information about the wine-patches mailing list