Module: wine Branch: master Commit: 608d086f1b1bb7168e9322c65224c23f34e75f29 URL: https://source.winehq.org/git/wine.git/?a=commit;h=608d086f1b1bb7168e9322c65...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Nov 7 17:00:39 2019 +0100
ntdll: Move some initializations out of thread_init().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/loader.c | 36 ++++++++++++++++++++++-------------- dlls/ntdll/ntdll_misc.h | 2 +- dlls/ntdll/thread.c | 22 +++------------------- 3 files changed, 26 insertions(+), 34 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index b16d646bdd..98c3f2d950 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -4234,8 +4234,22 @@ void __wine_process_init(void) UNICODE_STRING nt_name; void * (CDECL *init_func)(void); INITIAL_TEB stack; + BOOL suspend; + SIZE_T info_size; + TEB *teb = thread_init(); + PEB *peb = teb->Peb;
- thread_init(); + /* setup the server connection */ + server_init_process(); + info_size = server_init_thread( peb, &suspend ); + + peb->ProcessHeap = RtlCreateHeap( HEAP_GROWABLE, NULL, 0, 0, NULL, NULL ); + peb->LoaderLock = &loader_section; + + init_directories(); + init_user_process_params( info_size ); + + NtCreateKeyedEvent( &keyed_event, GENERIC_READ | GENERIC_WRITE, NULL, 0 );
/* retrieve current umask */ FILE_umask = umask(0777); @@ -4263,7 +4277,7 @@ void __wine_process_init(void)
kernel32_start_process = init_func();
- wm = get_modref( NtCurrentTeb()->Peb->ImageBaseAddress ); + wm = get_modref( peb->ImageBaseAddress ); assert( wm ); if (wm->ldr.Flags & LDR_IMAGE_IS_DLL) { @@ -4271,24 +4285,18 @@ void __wine_process_init(void) exit(1); }
- NtCurrentTeb()->Peb->LoaderLock = &loader_section; virtual_set_large_address_space();
/* the main exe needs to be the first in the load order list */ RemoveEntryList( &wm->ldr.InLoadOrderModuleList ); - InsertHeadList( &NtCurrentTeb()->Peb->LdrData->InLoadOrderModuleList, &wm->ldr.InLoadOrderModuleList ); + InsertHeadList( &peb->LdrData->InLoadOrderModuleList, &wm->ldr.InLoadOrderModuleList ); RemoveEntryList( &wm->ldr.InMemoryOrderModuleList ); - InsertHeadList( &NtCurrentTeb()->Peb->LdrData->InMemoryOrderModuleList, &wm->ldr.InMemoryOrderModuleList ); + InsertHeadList( &peb->LdrData->InMemoryOrderModuleList, &wm->ldr.InMemoryOrderModuleList );
- if ((status = virtual_alloc_thread_stack( &stack, 0, 0, NULL )) != STATUS_SUCCESS) - { - ERR( "Main exe initialization for %s failed, status %x\n", - debugstr_w(wm->ldr.FullDllName.Buffer), status ); - NtTerminateProcess( GetCurrentProcess(), status ); - } - NtCurrentTeb()->Tib.StackBase = stack.StackBase; - NtCurrentTeb()->Tib.StackLimit = stack.StackLimit; - NtCurrentTeb()->DeallocationStack = stack.DeallocationStack; + virtual_alloc_thread_stack( &stack, 0, 0, NULL ); + teb->Tib.StackBase = stack.StackBase; + teb->Tib.StackLimit = stack.StackLimit; + teb->DeallocationStack = stack.DeallocationStack;
server_init_process_done(); } diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 074792ff2a..eb31bb5bce 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -79,7 +79,7 @@ extern void DECLSPEC_NORETURN signal_exit_thread( int status ) DECLSPEC_HIDDEN; extern void DECLSPEC_NORETURN signal_exit_process( int status ) DECLSPEC_HIDDEN; extern void version_init(void) DECLSPEC_HIDDEN; extern void debug_init(void) DECLSPEC_HIDDEN; -extern void thread_init(void) DECLSPEC_HIDDEN; +extern TEB *thread_init(void) DECLSPEC_HIDDEN; extern void actctx_init(void) DECLSPEC_HIDDEN; extern void virtual_init(void) DECLSPEC_HIDDEN; extern void virtual_init_threading(void) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index be54f89082..621aaddfe3 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -220,12 +220,11 @@ static void set_process_name( int argc, char *argv[] ) * * NOTES: The first allocated TEB on NT is at 0x7ffde000. */ -void thread_init(void) +TEB *thread_init(void) { TEB *teb; void *addr; - BOOL suspend; - SIZE_T size, info_size; + SIZE_T size; LARGE_INTEGER now; NTSTATUS status; struct ntdll_thread_data *thread_data; @@ -299,21 +298,7 @@ void thread_init(void) signal_init_thread( teb ); virtual_init_threading(); debug_init(); - - /* setup the server connection */ - server_init_process(); - info_size = server_init_thread( peb, &suspend ); - - /* create the process heap */ - if (!(peb->ProcessHeap = RtlCreateHeap( HEAP_GROWABLE, NULL, 0, 0, NULL, NULL ))) - { - MESSAGE( "wine: failed to create the process heap\n" ); - exit(1); - } - set_process_name( __wine_main_argc, __wine_main_argv ); - init_directories(); - init_user_process_params( info_size );
/* initialize time values in user_shared_data */ NtQuerySystemTime( &now ); @@ -323,10 +308,9 @@ void thread_init(void) user_shared_data->u.TickCount.High2Time = user_shared_data->u.TickCount.High1Time; user_shared_data->TickCountLowDeprecated = user_shared_data->u.TickCount.LowPart; user_shared_data->TickCountMultiplier = 1 << 24; - fill_cpu_info();
- NtCreateKeyedEvent( &keyed_event, GENERIC_READ | GENERIC_WRITE, NULL, 0 ); + return teb; }