diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index ff52fb3680b..b33f4b1f930 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -199,7 +199,7 @@ static void *open_builtin_exe_file( const WCHAR *name, char *error, int error_si * Open a specific exe file, taking load order into account. * Returns the file handle or 0 for a builtin exe. */ -static HANDLE open_exe_file( const WCHAR *name ) +static HANDLE open_exe_file( const WCHAR *name, struct binary_info *binary_info ) { HANDLE handle; @@ -211,8 +211,16 @@ static HANDLE open_exe_file( const WCHAR *name ) WCHAR buffer[MAX_PATH]; /* file doesn't exist, check for builtin */ if (contains_path( name ) && get_builtin_path( name, NULL, buffer, sizeof(buffer) )) + { handle = 0; + binary_info->type = BINARY_UNIX_LIB; + binary_info->flags = 0; + binary_info->res_start = NULL; + binary_info->res_end = NULL; + } } + else MODULE_get_binary_info( handle, binary_info ); + return handle; } @@ -225,7 +233,8 @@ static HANDLE open_exe_file( const WCHAR *name ) * If file exists but cannot be opened, returns TRUE and set handle to INVALID_HANDLE_VALUE. * If file is a builtin exe, returns TRUE and sets handle to 0. */ -static BOOL find_exe_file( const WCHAR *name, WCHAR *buffer, int buflen, HANDLE *handle ) +static BOOL find_exe_file( const WCHAR *name, WCHAR *buffer, int buflen, + HANDLE *handle, struct binary_info *binary_info ) { static const WCHAR exeW[] = {'.','e','x','e',0}; int file_exists; @@ -242,7 +251,10 @@ static BOOL find_exe_file( const WCHAR *name, WCHAR *buffer, int buflen, HANDLE TRACE( "Trying native/Unix binary %s\n", debugstr_w(buffer) ); if ((*handle = CreateFileW( buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, 0 )) != INVALID_HANDLE_VALUE) + { + MODULE_get_binary_info( *handle, binary_info ); return TRUE; + } } return FALSE; } @@ -250,13 +262,20 @@ static BOOL find_exe_file( const WCHAR *name, WCHAR *buffer, int buflen, HANDLE TRACE( "Trying native exe %s\n", debugstr_w(buffer) ); if ((*handle = CreateFileW( buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, 0 )) != INVALID_HANDLE_VALUE) + { + MODULE_get_binary_info( *handle, binary_info ); return TRUE; + } TRACE( "Trying built-in exe %s\n", debugstr_w(buffer) ); open_builtin_exe_file( buffer, NULL, 0, 1, &file_exists ); if (file_exists) { *handle = 0; + binary_info->type = BINARY_UNIX_LIB; + binary_info->flags = 0; + binary_info->res_start = NULL; + binary_info->res_end = NULL; return TRUE; } @@ -1856,7 +1875,7 @@ static BOOL create_cmd_process( LPCWSTR filename, LPWSTR cmd_line, LPVOID env, L * Also returns a handle to the opened file if it's a Windows binary. */ static LPWSTR get_file_name( LPCWSTR appname, LPWSTR cmdline, LPWSTR buffer, - int buflen, HANDLE *handle ) + int buflen, HANDLE *handle, struct binary_info *binary_info ) { static const WCHAR quotesW[] = {'"','%','s','"',0}; @@ -1870,7 +1889,7 @@ static LPWSTR get_file_name( LPCWSTR appname, LPWSTR cmdline, LPWSTR buffer, { /* use the unmodified app name as file name */ lstrcpynW( buffer, appname, buflen ); - *handle = open_exe_file( buffer ); + *handle = open_exe_file( buffer, binary_info ); if (!(ret = cmdline) || !cmdline[0]) { /* no command-line, create one */ @@ -1890,7 +1909,7 @@ static LPWSTR get_file_name( LPCWSTR appname, LPWSTR cmdline, LPWSTR buffer, memcpy( name, cmdline + 1, len * sizeof(WCHAR) ); name[len] = 0; - if (find_exe_file( name, buffer, buflen, handle )) + if (find_exe_file( name, buffer, buflen, handle, binary_info )) ret = cmdline; /* no change necessary */ goto done; } @@ -1907,7 +1926,7 @@ static LPWSTR get_file_name( LPCWSTR appname, LPWSTR cmdline, LPWSTR buffer, { do *pos++ = *p++; while (*p && *p != ' ' && *p != '\t'); *pos = 0; - if (find_exe_file( name, buffer, buflen, handle )) + if (find_exe_file( name, buffer, buflen, handle, binary_info )) { ret = cmdline; break; @@ -1991,7 +2010,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, TRACE("app %s cmdline %s\n", debugstr_w(app_name), debugstr_w(cmd_line) ); - if (!(tidy_cmdline = get_file_name( app_name, cmd_line, name, sizeof(name)/sizeof(WCHAR), &hFile ))) + if (!(tidy_cmdline = get_file_name( app_name, cmd_line, name, sizeof(name)/sizeof(WCHAR), + &hFile, &binary_info ))) return FALSE; if (hFile == INVALID_HANDLE_VALUE) goto done; @@ -2033,19 +2053,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, info->hThread = info->hProcess = 0; info->dwProcessId = info->dwThreadId = 0; - /* Determine executable type */ - - if (!hFile) /* builtin exe */ - { - TRACE( "starting %s as Winelib app\n", debugstr_w(name) ); - memset( &binary_info, 0, sizeof(binary_info) ); - binary_info.type = BINARY_UNIX_LIB; - retv = create_process( 0, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr, - inherit, flags, startup_info, info, unixdir, &binary_info, FALSE ); - goto done; - } - - MODULE_get_binary_info( hFile, &binary_info ); if (binary_info.flags & BINARY_FLAG_DLL) { TRACE( "not starting %s since it is a dll\n", debugstr_w(name) ); @@ -2067,7 +2074,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, inherit, flags, startup_info, info, unixdir, &binary_info, FALSE ); break; case BINARY_UNIX_LIB: - TRACE( "%s is a Unix library, starting as Winelib app\n", debugstr_w(name) ); + TRACE( "starting %s as Winelib app\n", debugstr_w(name) ); retv = create_process( hFile, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr, inherit, flags, startup_info, info, unixdir, &binary_info, FALSE ); break; @@ -2107,7 +2114,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, } break; } - CloseHandle( hFile ); + if (hFile) CloseHandle( hFile ); done: if (tidy_cmdline != cmd_line) HeapFree( GetProcessHeap(), 0, tidy_cmdline ); @@ -2130,7 +2137,7 @@ static void exec_process( LPCWSTR name ) PROCESS_INFORMATION info; struct binary_info binary_info; - hFile = open_exe_file( name ); + hFile = open_exe_file( name, &binary_info ); if (!hFile || hFile == INVALID_HANDLE_VALUE) return; memset( &startup_info, 0, sizeof(startup_info) ); @@ -2138,7 +2145,6 @@ static void exec_process( LPCWSTR name ) /* Determine executable type */ - MODULE_get_binary_info( hFile, &binary_info ); if (binary_info.flags & BINARY_FLAG_DLL) return; switch (binary_info.type) {