ntdll: Move suspending a thread on startup into attach_dlls().
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
c3dd077d34
commit
f64d2688d2
|
@ -2990,12 +2990,14 @@ PIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE hModule)
|
||||||
* Attach to all the loaded dlls.
|
* Attach to all the loaded dlls.
|
||||||
* If this is the first time, perform the full process initialization.
|
* If this is the first time, perform the full process initialization.
|
||||||
*/
|
*/
|
||||||
NTSTATUS attach_dlls( void *reserved )
|
NTSTATUS attach_dlls( CONTEXT *context, BOOL suspend )
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
WINE_MODREF *wm;
|
WINE_MODREF *wm;
|
||||||
LPCWSTR load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer;
|
LPCWSTR load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer;
|
||||||
|
|
||||||
|
if (suspend) wait_suspend( context );
|
||||||
|
|
||||||
pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL );
|
pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL );
|
||||||
|
|
||||||
if (process_detaching) return STATUS_SUCCESS;
|
if (process_detaching) return STATUS_SUCCESS;
|
||||||
|
@ -3029,7 +3031,7 @@ NTSTATUS attach_dlls( void *reserved )
|
||||||
debugstr_w(NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer), status );
|
debugstr_w(NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer), status );
|
||||||
NtTerminateProcess( GetCurrentProcess(), status );
|
NtTerminateProcess( GetCurrentProcess(), status );
|
||||||
}
|
}
|
||||||
if ((status = process_attach( wm, reserved )) != STATUS_SUCCESS)
|
if ((status = process_attach( wm, context )) != STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
if (last_failed_modref)
|
if (last_failed_modref)
|
||||||
ERR( "%s failed to initialize, aborting\n",
|
ERR( "%s failed to initialize, aborting\n",
|
||||||
|
@ -3038,7 +3040,7 @@ NTSTATUS attach_dlls( void *reserved )
|
||||||
debugstr_w(NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer), status );
|
debugstr_w(NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer), status );
|
||||||
NtTerminateProcess( GetCurrentProcess(), status );
|
NtTerminateProcess( GetCurrentProcess(), status );
|
||||||
}
|
}
|
||||||
attach_implicitly_loaded_dlls( reserved );
|
attach_implicitly_loaded_dlls( context );
|
||||||
virtual_release_address_space();
|
virtual_release_address_space();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -105,7 +105,7 @@ extern NTSTATUS validate_open_object_attributes( const OBJECT_ATTRIBUTES *attr )
|
||||||
|
|
||||||
/* module handling */
|
/* module handling */
|
||||||
extern LIST_ENTRY tls_links DECLSPEC_HIDDEN;
|
extern LIST_ENTRY tls_links DECLSPEC_HIDDEN;
|
||||||
extern NTSTATUS attach_dlls( void *unused ) DECLSPEC_HIDDEN;
|
extern NTSTATUS attach_dlls( CONTEXT *context, BOOL suspend ) DECLSPEC_HIDDEN;
|
||||||
extern FARPROC RELAY_GetProcAddress( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports,
|
extern FARPROC RELAY_GetProcAddress( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports,
|
||||||
DWORD exp_size, FARPROC proc, DWORD ordinal, const WCHAR *user ) DECLSPEC_HIDDEN;
|
DWORD exp_size, FARPROC proc, DWORD ordinal, const WCHAR *user ) DECLSPEC_HIDDEN;
|
||||||
extern FARPROC SNOOP_GetProcAddress( HMODULE hmod, const IMAGE_EXPORT_DIRECTORY *exports, DWORD exp_size,
|
extern FARPROC SNOOP_GetProcAddress( HMODULE hmod, const IMAGE_EXPORT_DIRECTORY *exports, DWORD exp_size,
|
||||||
|
|
|
@ -1230,8 +1230,7 @@ static void thread_startup( void *param )
|
||||||
context.Sp = (DWORD)NtCurrentTeb()->Tib.StackBase;
|
context.Sp = (DWORD)NtCurrentTeb()->Tib.StackBase;
|
||||||
context.Pc = (DWORD)call_thread_entry_point;
|
context.Pc = (DWORD)call_thread_entry_point;
|
||||||
|
|
||||||
if (info->suspend) wait_suspend( &context );
|
attach_dlls( &context, info->suspend );
|
||||||
attach_dlls( &context );
|
|
||||||
|
|
||||||
set_cpu_context( &context );
|
set_cpu_context( &context );
|
||||||
}
|
}
|
||||||
|
|
|
@ -973,8 +973,7 @@ static void thread_startup( void *param )
|
||||||
context.Sp = (DWORD_PTR)NtCurrentTeb()->Tib.StackBase;
|
context.Sp = (DWORD_PTR)NtCurrentTeb()->Tib.StackBase;
|
||||||
context.Pc = (DWORD_PTR)call_thread_entry_point;
|
context.Pc = (DWORD_PTR)call_thread_entry_point;
|
||||||
|
|
||||||
if (info->suspend) wait_suspend( &context );
|
attach_dlls( &context, info->suspend );
|
||||||
attach_dlls( &context );
|
|
||||||
|
|
||||||
call_thread_entry_point( (LPTHREAD_START_ROUTINE)context.X0, (void *)context.X1 );
|
call_thread_entry_point( (LPTHREAD_START_ROUTINE)context.X0, (void *)context.X1 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -2984,8 +2984,7 @@ void DECLSPEC_HIDDEN call_process_func( LPTHREAD_START_ROUTINE entry, void *arg
|
||||||
*/
|
*/
|
||||||
void DECLSPEC_HIDDEN thread_startup( CONTEXT *context, BOOL suspend )
|
void DECLSPEC_HIDDEN thread_startup( CONTEXT *context, BOOL suspend )
|
||||||
{
|
{
|
||||||
if (suspend) wait_suspend( context );
|
attach_dlls( context, suspend );
|
||||||
attach_dlls( context );
|
|
||||||
virtual_clear_thread_stack();
|
virtual_clear_thread_stack();
|
||||||
set_cpu_context( context );
|
set_cpu_context( context );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1175,8 +1175,7 @@ static void thread_startup( void *param )
|
||||||
context.Gpr4 = (DWORD)info->arg;
|
context.Gpr4 = (DWORD)info->arg;
|
||||||
context.Iar = (DWORD)call_thread_entry_point;
|
context.Iar = (DWORD)call_thread_entry_point;
|
||||||
|
|
||||||
if (info->suspend) wait_suspend( &context );
|
attach_dlls( &context, info->suspend );
|
||||||
attach_dlls( &context );
|
|
||||||
|
|
||||||
call_thread_entry_point( (LPTHREAD_START_ROUTINE)context.Gpr3, (void *)context.Gpr4 );
|
call_thread_entry_point( (LPTHREAD_START_ROUTINE)context.Gpr3, (void *)context.Gpr4 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -4145,8 +4145,7 @@ __ASM_GLOBAL_FUNC( call_thread_exit_func,
|
||||||
*/
|
*/
|
||||||
void DECLSPEC_HIDDEN thread_startup( CONTEXT *context, BOOL suspend )
|
void DECLSPEC_HIDDEN thread_startup( CONTEXT *context, BOOL suspend )
|
||||||
{
|
{
|
||||||
if (suspend) wait_suspend( context );
|
attach_dlls( context, suspend );
|
||||||
attach_dlls( context );
|
|
||||||
virtual_clear_thread_stack();
|
virtual_clear_thread_stack();
|
||||||
set_cpu_context( context );
|
set_cpu_context( context );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue