ntdll: Get rid of the exec_process() Unix library callback.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2020-09-02 15:06:05 +02:00
parent f51cd0a1b5
commit 4c45348f78
5 changed files with 41 additions and 25 deletions

View File

@ -3957,7 +3957,7 @@ static void restart_winevdm( RTL_USER_PROCESS_PARAMETERS *params )
/*********************************************************************** /***********************************************************************
* process_init * process_init
*/ */
static void process_init(void) static NTSTATUS process_init(void)
{ {
static const WCHAR ntdllW[] = {'\\','?','?','\\','C',':','\\','w','i','n','d','o','w','s','\\', static const WCHAR ntdllW[] = {'\\','?','?','\\','C',':','\\','w','i','n','d','o','w','s','\\',
's','y','s','t','e','m','3','2','\\', 's','y','s','t','e','m','3','2','\\',
@ -4058,20 +4058,17 @@ static void process_init(void)
restart_winevdm( params ); restart_winevdm( params );
status = STATUS_INVALID_IMAGE_WIN_16; status = STATUS_INVALID_IMAGE_WIN_16;
} }
status = unix_funcs->exec_process( status ); return status;
break;
} }
case STATUS_INVALID_IMAGE_WIN_16: case STATUS_INVALID_IMAGE_WIN_16:
case STATUS_INVALID_IMAGE_NE_FORMAT: case STATUS_INVALID_IMAGE_NE_FORMAT:
case STATUS_INVALID_IMAGE_PROTECT: case STATUS_INVALID_IMAGE_PROTECT:
restart_winevdm( params ); restart_winevdm( params );
status = unix_funcs->exec_process( status ); return status;
break;
case STATUS_CONFLICTING_ADDRESSES: case STATUS_CONFLICTING_ADDRESSES:
case STATUS_NO_MEMORY: case STATUS_NO_MEMORY:
case STATUS_INVALID_IMAGE_FORMAT: case STATUS_INVALID_IMAGE_FORMAT:
status = unix_funcs->exec_process( status ); return status;
break;
case STATUS_INVALID_IMAGE_WIN_64: case STATUS_INVALID_IMAGE_WIN_64:
ERR( "%s 64-bit application not supported in 32-bit prefix\n", ERR( "%s 64-bit application not supported in 32-bit prefix\n",
debugstr_us(&params->ImagePathName) ); debugstr_us(&params->ImagePathName) );
@ -4109,14 +4106,15 @@ static void process_init(void)
teb->Tib.StackBase = stack.StackBase; teb->Tib.StackBase = stack.StackBase;
teb->Tib.StackLimit = stack.StackLimit; teb->Tib.StackLimit = stack.StackLimit;
teb->DeallocationStack = stack.DeallocationStack; teb->DeallocationStack = stack.DeallocationStack;
return STATUS_SUCCESS;
} }
/*********************************************************************** /***********************************************************************
* __wine_set_unix_funcs * __wine_set_unix_funcs
*/ */
void CDECL __wine_set_unix_funcs( int version, const struct unix_funcs *funcs ) NTSTATUS CDECL __wine_set_unix_funcs( int version, const struct unix_funcs *funcs )
{ {
assert( version == NTDLL_UNIXLIB_VERSION ); assert( version == NTDLL_UNIXLIB_VERSION );
unix_funcs = funcs; unix_funcs = funcs;
process_init(); return process_init();
} }

View File

@ -99,7 +99,7 @@ NTSTATUS (WINAPI *pKiUserExceptionDispatcher)(EXCEPTION_RECORD*,CONTEXT*) = NULL
void (WINAPI *pLdrInitializeThunk)(CONTEXT*,void**,ULONG_PTR,ULONG_PTR) = NULL; void (WINAPI *pLdrInitializeThunk)(CONTEXT*,void**,ULONG_PTR,ULONG_PTR) = NULL;
void (WINAPI *pRtlUserThreadStart)( PRTL_THREAD_START_ROUTINE entry, void *arg ) = NULL; void (WINAPI *pRtlUserThreadStart)( PRTL_THREAD_START_ROUTINE entry, void *arg ) = NULL;
static void (CDECL *p__wine_set_unix_funcs)( int version, const struct unix_funcs *funcs ); static NTSTATUS (CDECL *p__wine_set_unix_funcs)( int version, const struct unix_funcs *funcs );
#ifdef __GNUC__ #ifdef __GNUC__
static void fatal_error( const char *err, ... ) __attribute__((noreturn, format(printf,1,2))); static void fatal_error( const char *err, ... ) __attribute__((noreturn, format(printf,1,2)));
@ -1367,7 +1367,6 @@ static struct unix_funcs unix_funcs =
get_unix_codepage_data, get_unix_codepage_data,
get_locales, get_locales,
virtual_release_address_space, virtual_release_address_space,
exec_process,
set_show_dot_files, set_show_dot_files,
load_so_dll, load_so_dll,
load_builtin_dll, load_builtin_dll,
@ -1387,6 +1386,7 @@ static struct unix_funcs unix_funcs =
static void start_main_thread(void) static void start_main_thread(void)
{ {
BOOL suspend; BOOL suspend;
NTSTATUS status;
TEB *teb = virtual_alloc_first_teb(); TEB *teb = virtual_alloc_first_teb();
signal_init_threading(); signal_init_threading();
@ -1399,7 +1399,8 @@ static void start_main_thread(void)
init_cpu_info(); init_cpu_info();
init_files(); init_files();
NtCreateKeyedEvent( &keyed_event, GENERIC_READ | GENERIC_WRITE, NULL, 0 ); NtCreateKeyedEvent( &keyed_event, GENERIC_READ | GENERIC_WRITE, NULL, 0 );
p__wine_set_unix_funcs( NTDLL_UNIXLIB_VERSION, &unix_funcs ); status = p__wine_set_unix_funcs( NTDLL_UNIXLIB_VERSION, &unix_funcs );
if (status) exec_process( status );
server_init_process_done(); server_init_process_done();
} }

View File

@ -613,7 +613,7 @@ static NTSTATUS spawn_process( const RTL_USER_PROCESS_PARAMETERS *params, int so
/*********************************************************************** /***********************************************************************
* exec_process * exec_process
*/ */
NTSTATUS CDECL exec_process( NTSTATUS status ) void DECLSPEC_NORETURN exec_process( NTSTATUS status )
{ {
RTL_USER_PROCESS_PARAMETERS *params = NtCurrentTeb()->Peb->ProcessParameters; RTL_USER_PROCESS_PARAMETERS *params = NtCurrentTeb()->Peb->ProcessParameters;
pe_image_info_t pe_info; pe_image_info_t pe_info;
@ -621,7 +621,7 @@ NTSTATUS CDECL exec_process( NTSTATUS status )
char **argv; char **argv;
HANDLE handle; HANDLE handle;
if (startup_info_size) return status; /* started from another Win32 process */ if (startup_info_size) goto done; /* started from another Win32 process */
switch (status) switch (status)
{ {
@ -631,10 +631,10 @@ NTSTATUS CDECL exec_process( NTSTATUS status )
case STATUS_INVALID_IMAGE_NOT_MZ: case STATUS_INVALID_IMAGE_NOT_MZ:
{ {
UNICODE_STRING image; UNICODE_STRING image;
if (getenv( "WINEPRELOADRESERVE" )) return status; if (getenv( "WINEPRELOADRESERVE" )) goto done;
image.Buffer = get_nt_pathname( &params->ImagePathName ); image.Buffer = get_nt_pathname( &params->ImagePathName );
image.Length = wcslen( image.Buffer ) * sizeof(WCHAR); image.Length = wcslen( image.Buffer ) * sizeof(WCHAR);
if ((status = get_pe_file_info( &image, &handle, &pe_info ))) return status; if ((status = get_pe_file_info( &image, &handle, &pe_info ))) goto done;
break; break;
} }
case STATUS_INVALID_IMAGE_WIN_16: case STATUS_INVALID_IMAGE_WIN_16:
@ -645,12 +645,16 @@ NTSTATUS CDECL exec_process( NTSTATUS status )
pe_info.cpu = CPU_x86; pe_info.cpu = CPU_x86;
break; break;
default: default:
return status; goto done;
} }
unixdir = get_unix_curdir( params ); unixdir = get_unix_curdir( params );
if (socketpair( PF_UNIX, SOCK_STREAM, 0, socketfd ) == -1) return STATUS_TOO_MANY_OPENED_FILES; if (socketpair( PF_UNIX, SOCK_STREAM, 0, socketfd ) == -1)
{
status = STATUS_TOO_MANY_OPENED_FILES;
goto done;
}
#ifdef SO_PASSCRED #ifdef SO_PASSCRED
else else
{ {
@ -671,7 +675,11 @@ NTSTATUS CDECL exec_process( NTSTATUS status )
if (!status) if (!status)
{ {
if (!(argv = build_argv( &params->CommandLine, 2 ))) return STATUS_NO_MEMORY; if (!(argv = build_argv( &params->CommandLine, 2 )))
{
status = STATUS_NO_MEMORY;
goto done;
}
fchdir( unixdir ); fchdir( unixdir );
do do
{ {
@ -685,7 +693,19 @@ NTSTATUS CDECL exec_process( NTSTATUS status )
free( argv ); free( argv );
} }
close( socketfd[0] ); close( socketfd[0] );
return status;
done:
switch (status)
{
case STATUS_INVALID_IMAGE_FORMAT:
case STATUS_INVALID_IMAGE_NOT_MZ:
ERR( "%s not supported on this system\n", debugstr_us(&params->ImagePathName) );
break;
default:
ERR( "failed to load %s error %x\n", debugstr_us(&params->ImagePathName), status );
break;
}
for (;;) NtTerminateProcess( GetCurrentProcess(), status );
} }

View File

@ -117,7 +117,6 @@ extern USHORT * CDECL get_unix_codepage_data(void) DECLSPEC_HIDDEN;
extern void CDECL get_locales( WCHAR *sys, WCHAR *user ) DECLSPEC_HIDDEN; extern void CDECL get_locales( WCHAR *sys, WCHAR *user ) DECLSPEC_HIDDEN;
extern void CDECL virtual_release_address_space(void) DECLSPEC_HIDDEN; extern void CDECL virtual_release_address_space(void) DECLSPEC_HIDDEN;
extern NTSTATUS CDECL exec_process( NTSTATUS status ) DECLSPEC_HIDDEN;
extern NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, extern NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispatch,
CONTEXT *context ) DECLSPEC_HIDDEN; CONTEXT *context ) DECLSPEC_HIDDEN;
@ -220,6 +219,7 @@ extern void signal_init_process(void) DECLSPEC_HIDDEN;
extern void DECLSPEC_NORETURN signal_start_thread( PRTL_THREAD_START_ROUTINE entry, void *arg, extern void DECLSPEC_NORETURN signal_start_thread( PRTL_THREAD_START_ROUTINE entry, void *arg,
BOOL suspend, void *thunk, TEB *teb ) DECLSPEC_HIDDEN; BOOL suspend, void *thunk, TEB *teb ) DECLSPEC_HIDDEN;
extern void DECLSPEC_NORETURN signal_exit_thread( int status, void (*func)(int) ) DECLSPEC_HIDDEN; extern void DECLSPEC_NORETURN signal_exit_thread( int status, void (*func)(int) ) DECLSPEC_HIDDEN;
extern void DECLSPEC_NORETURN exec_process( NTSTATUS status ) DECLSPEC_HIDDEN;
extern void __wine_syscall_dispatcher(void) DECLSPEC_HIDDEN; extern void __wine_syscall_dispatcher(void) DECLSPEC_HIDDEN;
extern void fill_vm_counters( VM_COUNTERS_EX *pvmi, int unix_pid ) DECLSPEC_HIDDEN; extern void fill_vm_counters( VM_COUNTERS_EX *pvmi, int unix_pid ) DECLSPEC_HIDDEN;

View File

@ -27,7 +27,7 @@
struct _DISPATCHER_CONTEXT; struct _DISPATCHER_CONTEXT;
/* increment this when you change the function table */ /* increment this when you change the function table */
#define NTDLL_UNIXLIB_VERSION 103 #define NTDLL_UNIXLIB_VERSION 104
struct unix_funcs struct unix_funcs
{ {
@ -81,9 +81,6 @@ struct unix_funcs
/* virtual memory functions */ /* virtual memory functions */
void (CDECL *virtual_release_address_space)(void); void (CDECL *virtual_release_address_space)(void);
/* thread/process functions */
NTSTATUS (CDECL *exec_process)( NTSTATUS status );
/* file functions */ /* file functions */
void (CDECL *set_show_dot_files)( BOOL enable ); void (CDECL *set_show_dot_files)( BOOL enable );