Commit a9feb3d2 authored by Alexandre Julliard's avatar Alexandre Julliard

kernel32: Check the 64-bit flag when starting a process.

parent 8c11d71f
...@@ -1512,7 +1512,7 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW ...@@ -1512,7 +1512,7 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
LPCWSTR cur_dir, LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa, LPCWSTR cur_dir, LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa,
BOOL inherit, DWORD flags, LPSTARTUPINFOW startup, BOOL inherit, DWORD flags, LPSTARTUPINFOW startup,
LPPROCESS_INFORMATION info, LPCSTR unixdir, LPPROCESS_INFORMATION info, LPCSTR unixdir,
void *res_start, void *res_end, int exec_only ) void *res_start, void *res_end, DWORD binary_type, int exec_only )
{ {
BOOL ret, success = FALSE; BOOL ret, success = FALSE;
HANDLE process_info, hstdin, hstdout; HANDLE process_info, hstdin, hstdout;
...@@ -1524,6 +1524,13 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW ...@@ -1524,6 +1524,13 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
pid_t pid; pid_t pid;
int err; int err;
if (sizeof(void *) == sizeof(int) && !is_wow64 && (binary_type & BINARY_FLAG_64BIT))
{
ERR( "starting 64-bit process %s not supported on this platform\n", debugstr_w(filename) );
SetLastError( ERROR_BAD_EXE_FORMAT );
return FALSE;
}
if (!env) RtlAcquirePebLock(); if (!env) RtlAcquirePebLock();
if (!(params = create_user_params( filename, cmd_line, cur_dir, env, flags, startup ))) if (!(params = create_user_params( filename, cmd_line, cur_dir, env, flags, startup )))
...@@ -1716,7 +1723,8 @@ error: ...@@ -1716,7 +1723,8 @@ error:
static BOOL create_vdm_process( LPCWSTR filename, LPWSTR cmd_line, LPWSTR env, LPCWSTR cur_dir, static BOOL create_vdm_process( LPCWSTR filename, LPWSTR cmd_line, LPWSTR env, LPCWSTR cur_dir,
LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa, LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa,
BOOL inherit, DWORD flags, LPSTARTUPINFOW startup, BOOL inherit, DWORD flags, LPSTARTUPINFOW startup,
LPPROCESS_INFORMATION info, LPCSTR unixdir, int exec_only ) LPPROCESS_INFORMATION info, LPCSTR unixdir,
DWORD binary_type, int exec_only )
{ {
static const WCHAR argsW[] = {'%','s',' ','-','-','a','p','p','-','n','a','m','e',' ','"','%','s','"',' ','%','s',0}; static const WCHAR argsW[] = {'%','s',' ','-','-','a','p','p','-','n','a','m','e',' ','"','%','s','"',' ','%','s',0};
...@@ -1731,7 +1739,7 @@ static BOOL create_vdm_process( LPCWSTR filename, LPWSTR cmd_line, LPWSTR env, L ...@@ -1731,7 +1739,7 @@ static BOOL create_vdm_process( LPCWSTR filename, LPWSTR cmd_line, LPWSTR env, L
} }
sprintfW( new_cmd_line, argsW, winevdmW, filename, cmd_line ); sprintfW( new_cmd_line, argsW, winevdmW, filename, cmd_line );
ret = create_process( 0, winevdmW, new_cmd_line, env, cur_dir, psa, tsa, inherit, ret = create_process( 0, winevdmW, new_cmd_line, env, cur_dir, psa, tsa, inherit,
flags, startup, info, unixdir, NULL, NULL, exec_only ); flags, startup, info, unixdir, NULL, NULL, binary_type, exec_only );
HeapFree( GetProcessHeap(), 0, new_cmd_line ); HeapFree( GetProcessHeap(), 0, new_cmd_line );
return ret; return ret;
} }
...@@ -1963,7 +1971,8 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB ...@@ -1963,7 +1971,8 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB
{ {
TRACE( "starting %s as Winelib app\n", debugstr_w(name) ); TRACE( "starting %s as Winelib app\n", debugstr_w(name) );
retv = create_process( 0, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr, retv = create_process( 0, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
inherit, flags, startup_info, info, unixdir, NULL, NULL, FALSE ); inherit, flags, startup_info, info, unixdir, NULL, NULL,
BINARY_UNIX_LIB, FALSE );
goto done; goto done;
} }
...@@ -1978,19 +1987,21 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB ...@@ -1978,19 +1987,21 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB
case BINARY_PE: case BINARY_PE:
TRACE( "starting %s as Win32 binary (%p-%p)\n", debugstr_w(name), res_start, res_end ); TRACE( "starting %s as Win32 binary (%p-%p)\n", debugstr_w(name), res_start, res_end );
retv = create_process( hFile, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr, retv = create_process( hFile, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
inherit, flags, startup_info, info, unixdir, res_start, res_end, FALSE ); inherit, flags, startup_info, info, unixdir,
res_start, res_end, binary_type, FALSE );
break; break;
case BINARY_OS216: case BINARY_OS216:
case BINARY_WIN16: case BINARY_WIN16:
case BINARY_DOS: case BINARY_DOS:
TRACE( "starting %s as Win16/DOS binary\n", debugstr_w(name) ); TRACE( "starting %s as Win16/DOS binary\n", debugstr_w(name) );
retv = create_vdm_process( name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr, retv = create_vdm_process( name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
inherit, flags, startup_info, info, unixdir, FALSE ); inherit, flags, startup_info, info, unixdir, binary_type, FALSE );
break; break;
case BINARY_UNIX_LIB: case BINARY_UNIX_LIB:
TRACE( "%s is a Unix library, starting as Winelib app\n", debugstr_w(name) ); TRACE( "%s is a Unix library, starting as Winelib app\n", debugstr_w(name) );
retv = create_process( hFile, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr, retv = create_process( hFile, name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
inherit, flags, startup_info, info, unixdir, NULL, NULL, FALSE ); inherit, flags, startup_info, info, unixdir,
NULL, NULL, binary_type, FALSE );
break; break;
case BINARY_UNKNOWN: case BINARY_UNKNOWN:
/* check for .com or .bat extension */ /* check for .com or .bat extension */
...@@ -2000,7 +2011,8 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB ...@@ -2000,7 +2011,8 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB
{ {
TRACE( "starting %s as DOS binary\n", debugstr_w(name) ); TRACE( "starting %s as DOS binary\n", debugstr_w(name) );
retv = create_vdm_process( name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr, retv = create_vdm_process( name, tidy_cmdline, envW, cur_dir, process_attr, thread_attr,
inherit, flags, startup_info, info, unixdir, FALSE ); inherit, flags, startup_info, info, unixdir,
binary_type, FALSE );
break; break;
} }
if (!strcmpiW( p, batW ) || !strcmpiW( p, cmdW ) ) if (!strcmpiW( p, batW ) || !strcmpiW( p, cmdW ) )
...@@ -2066,12 +2078,12 @@ static void exec_process( LPCWSTR name ) ...@@ -2066,12 +2078,12 @@ static void exec_process( LPCWSTR name )
case BINARY_PE: case BINARY_PE:
TRACE( "starting %s as Win32 binary (%p-%p)\n", debugstr_w(name), res_start, res_end ); TRACE( "starting %s as Win32 binary (%p-%p)\n", debugstr_w(name), res_start, res_end );
create_process( hFile, name, GetCommandLineW(), NULL, NULL, NULL, NULL, create_process( hFile, name, GetCommandLineW(), NULL, NULL, NULL, NULL,
FALSE, 0, &startup_info, &info, NULL, res_start, res_end, TRUE ); FALSE, 0, &startup_info, &info, NULL, res_start, res_end, binary_type, TRUE );
break; break;
case BINARY_UNIX_LIB: case BINARY_UNIX_LIB:
TRACE( "%s is a Unix library, starting as Winelib app\n", debugstr_w(name) ); TRACE( "%s is a Unix library, starting as Winelib app\n", debugstr_w(name) );
create_process( hFile, name, GetCommandLineW(), NULL, NULL, NULL, NULL, create_process( hFile, name, GetCommandLineW(), NULL, NULL, NULL, NULL,
FALSE, 0, &startup_info, &info, NULL, NULL, NULL, TRUE ); FALSE, 0, &startup_info, &info, NULL, NULL, NULL, binary_type, TRUE );
break; break;
case BINARY_UNKNOWN: case BINARY_UNKNOWN:
/* check for .com or .pif extension */ /* check for .com or .pif extension */
...@@ -2083,7 +2095,7 @@ static void exec_process( LPCWSTR name ) ...@@ -2083,7 +2095,7 @@ static void exec_process( LPCWSTR name )
case BINARY_DOS: case BINARY_DOS:
TRACE( "starting %s as Win16/DOS binary\n", debugstr_w(name) ); TRACE( "starting %s as Win16/DOS binary\n", debugstr_w(name) );
create_vdm_process( name, GetCommandLineW(), NULL, NULL, NULL, NULL, create_vdm_process( name, GetCommandLineW(), NULL, NULL, NULL, NULL,
FALSE, 0, &startup_info, &info, NULL, TRUE ); FALSE, 0, &startup_info, &info, NULL, binary_type, TRUE );
break; break;
default: default:
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment