Moved the constructor for the initial TEB to ntdll so that it runs as

early as possible on startup.
This commit is contained in:
Alexandre Julliard 2003-10-09 04:59:03 +00:00
parent 36a6c740c4
commit 20e73d739a
4 changed files with 74 additions and 63 deletions

View File

@ -96,9 +96,7 @@ typedef struct _PDB
LCID locale; /* c4 Locale to be queried by GetThreadLocale (NT) */
} PDB;
PDB current_process;
static PEB_LDR_DATA process_ldr;
static PDB *current_process;
static HANDLE main_exe_file;
static DWORD shutdown_flags = 0;
@ -660,11 +658,9 @@ static RTL_USER_PROCESS_PARAMETERS *init_user_process_params( size_t info_size )
*/
static BOOL process_init( char *argv[] )
{
static RTL_USER_PROCESS_PARAMETERS default_params; /* default parameters if no parent */
BOOL ret;
size_t info_size = 0;
RTL_USER_PROCESS_PARAMETERS *params = &default_params;
RTL_USER_PROCESS_PARAMETERS *params;
HANDLE hstdin, hstdout, hstderr;
setbuf(stdout,NULL);
@ -672,16 +668,13 @@ static BOOL process_init( char *argv[] )
setlocale(LC_CTYPE,"");
/* Fill the initial process structure */
current_process.threads = 1;
current_process.running_threads = 1;
current_process.ring0_threads = 1;
current_process.group = &current_process;
current_process.priority = 8; /* Normal */
current_process.ProcessParameters = &default_params;
current_process.LdrData = &process_ldr;
InitializeListHead(&process_ldr.InLoadOrderModuleList);
InitializeListHead(&process_ldr.InMemoryOrderModuleList);
InitializeListHead(&process_ldr.InInitializationOrderModuleList);
current_process = (PDB *)NtCurrentTeb()->Peb; /* FIXME: should be a PEB */
params = current_process->ProcessParameters;
current_process->threads = 1;
current_process->running_threads = 1;
current_process->ring0_threads = 1;
current_process->group = current_process;
current_process->priority = 8; /* Normal */
/* Setup the server connection */
wine_server_init_thread();
@ -705,7 +698,7 @@ static BOOL process_init( char *argv[] )
if (!ret) return FALSE;
/* Create the process heap */
current_process.heap = RtlCreateHeap( HEAP_GROWABLE, NULL, 0, 0, NULL, NULL );
current_process->heap = RtlCreateHeap( HEAP_GROWABLE, NULL, 0, 0, NULL, NULL );
if (info_size == 0)
{
@ -730,7 +723,7 @@ static BOOL process_init( char *argv[] )
else
{
if (!(params = init_user_process_params( info_size ))) return FALSE;
current_process.ProcessParameters = params;
current_process->ProcessParameters = params;
/* convert value from server:
* + 0 => INVALID_HANDLE_VALUE
@ -813,13 +806,14 @@ void __wine_process_init( int argc, char *argv[] )
char error[1024];
DWORD stack_size = 0;
int file_exists;
PEB *peb = NtCurrentTeb()->Peb;
/* Initialize everything */
if (!process_init( argv )) exit(1);
argv++; /* remove argv[0] (wine itself) */
if (!(main_exe_name = NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer))
if (!(main_exe_name = peb->ProcessParameters->ImagePathName.Buffer))
{
WCHAR buffer[MAX_PATH];
WCHAR exe_nameW[MAX_PATH];
@ -838,8 +832,8 @@ void __wine_process_init( int argc, char *argv[] )
MESSAGE( "wine: cannot open %s\n", debugstr_w(main_exe_name) );
ExitProcess(1);
}
RtlCreateUnicodeString( &NtCurrentTeb()->Peb->ProcessParameters->ImagePathName, buffer );
main_exe_name = NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer;
RtlCreateUnicodeString( &peb->ProcessParameters->ImagePathName, buffer );
main_exe_name = peb->ProcessParameters->ImagePathName.Buffer;
}
TRACE( "starting process name=%s file=%p argv[0]=%s\n",
@ -862,7 +856,8 @@ void __wine_process_init( int argc, char *argv[] )
{
case BINARY_PE_EXE:
TRACE( "starting Win32 binary %s\n", debugstr_w(main_exe_name) );
if ((current_process.module = load_pe_exe( main_exe_name, main_exe_file ))) goto found;
if ((peb->ImageBaseAddress = load_pe_exe( main_exe_name, main_exe_file )))
goto found;
MESSAGE( "wine: could not load %s as Win32 binary\n", debugstr_w(main_exe_name) );
ExitProcess(1);
case BINARY_PE_DLL:
@ -910,8 +905,7 @@ void __wine_process_init( int argc, char *argv[] )
{
*p = 0;
/* update the unicode string */
RtlInitUnicodeString( &NtCurrentTeb()->Peb->ProcessParameters->ImagePathName,
main_exe_name );
RtlInitUnicodeString( &peb->ProcessParameters->ImagePathName, main_exe_name );
}
goto found;
}
@ -926,9 +920,9 @@ void __wine_process_init( int argc, char *argv[] )
if (!build_command_line( __wine_main_wargv )) goto error;
/* create 32-bit module for main exe */
if (!(current_process.module = BUILTIN32_LoadExeModule( current_process.module, CreateFileW )))
if (!(peb->ImageBaseAddress = BUILTIN32_LoadExeModule( peb->ImageBaseAddress, CreateFileW )))
goto error;
stack_size = RtlImageNtHeader(current_process.module)->OptionalHeader.SizeOfStackReserve;
stack_size = RtlImageNtHeader(peb->ImageBaseAddress)->OptionalHeader.SizeOfStackReserve;
/* allocate main thread stack */
if (!THREAD_InitStack( NtCurrentTeb(), stack_size )) goto error;
@ -1948,8 +1942,8 @@ BOOL WINAPI GetExitCodeProcess(
*/
UINT WINAPI SetErrorMode( UINT mode )
{
UINT old = current_process.error_mode;
current_process.error_mode = mode;
UINT old = current_process->error_mode;
current_process->error_mode = mode;
return old;
}
@ -1966,7 +1960,7 @@ UINT WINAPI SetErrorMode( UINT mode )
DWORD WINAPI TlsAlloc( void )
{
DWORD i, mask, ret = 0;
DWORD *bits = current_process.tls_bits;
DWORD *bits = current_process->tls_bits;
RtlAcquirePebLock();
if (*bits == 0xffffffff)
{
@ -2000,7 +1994,7 @@ BOOL WINAPI TlsFree(
DWORD index) /* [in] TLS Index to free */
{
DWORD mask = (1 << (index & 31));
DWORD *bits = current_process.tls_bits;
DWORD *bits = current_process->tls_bits;
if (index >= 64)
{
SetLastError( ERROR_INVALID_PARAMETER );

View File

@ -48,11 +48,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(thread);
WINE_DECLARE_DEBUG_CHANNEL(relay);
/* TEB of the initial thread */
static TEB initial_teb;
extern struct _PDB current_process;
/***********************************************************************
* THREAD_InitTEB
*
@ -147,32 +142,6 @@ TEB *THREAD_InitStack( TEB *teb, DWORD stack_size )
}
/***********************************************************************
* THREAD_Init
*
* Setup the initial thread.
*
* NOTES: The first allocated TEB on NT is at 0x7ffde000.
*/
void THREAD_Init(void)
{
static struct debug_info info; /* debug info for initial thread */
if (!initial_teb.Tib.Self) /* do it only once */
{
THREAD_InitTEB( &initial_teb );
assert( initial_teb.teb_sel );
info.str_pos = info.strings;
info.out_pos = info.output;
initial_teb.debug_info = &info;
initial_teb.Peb = (PEB *)&current_process; /* FIXME */
SYSDEPS_SetCurThread( &initial_teb );
}
}
DECL_GLOBAL_CONSTRUCTOR(thread_init) { THREAD_Init(); }
/***********************************************************************
* THREAD_Start
*

View File

@ -18,15 +18,64 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#include "wine/port.h"
#include "ntstatus.h"
#include "thread.h"
#include "winternl.h"
#include "wine/library.h"
#include "wine/server.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(thread);
/***********************************************************************
* thread_init
*
* Setup the initial thread.
*
* NOTES: The first allocated TEB on NT is at 0x7ffde000.
*/
DECL_GLOBAL_CONSTRUCTOR(thread_init)
{
static TEB teb;
static PEB peb;
static PEB_LDR_DATA ldr;
static RTL_USER_PROCESS_PARAMETERS params; /* default parameters if no parent */
static struct debug_info info; /* debug info for initial thread */
if (teb.Tib.Self) return; /* do it only once */
info.str_pos = info.strings;
info.out_pos = info.output;
teb.Tib.ExceptionList = (void *)~0UL;
teb.Tib.StackBase = (void *)~0UL;
teb.Tib.Self = &teb.Tib;
teb.Peb = &peb;
teb.tibflags = TEBF_WIN32;
teb.request_fd = -1;
teb.reply_fd = -1;
teb.wait_fd[0] = -1;
teb.wait_fd[1] = -1;
teb.teb_sel = wine_ldt_alloc_fs();
teb.debug_info = &info;
teb.StaticUnicodeString.MaximumLength = sizeof(teb.StaticUnicodeBuffer);
teb.StaticUnicodeString.Buffer = teb.StaticUnicodeBuffer;
InitializeListHead( &teb.TlsLinks );
peb.ProcessParameters = &params;
peb.LdrData = &ldr;
InitializeListHead( &ldr.InLoadOrderModuleList );
InitializeListHead( &ldr.InMemoryOrderModuleList );
InitializeListHead( &ldr.InInitializationOrderModuleList );
SYSDEPS_SetCurThread( &teb );
}
/***********************************************************************
* NtOpenThread (NTDLL.@)
* ZwOpenThread (NTDLL.@)

View File

@ -125,7 +125,7 @@ typedef struct _TEB
/* the following are nt specific fields */
DWORD pad6[624]; /* --n 238 */
UNICODE_STRING StaticUnicodeString; /* -2- bf8 used by advapi32 */
USHORT StaticUnicodeBuffer[261]; /* -2- c00 used by advapi32 */
WCHAR StaticUnicodeBuffer[261]; /* -2- c00 used by advapi32 */
PVOID DeallocationStack; /* -2- e0c Base of the stack */
LPVOID TlsSlots[64]; /* -2- e10 Thread local storage */
LIST_ENTRY TlsLinks; /* -2- f10 */
@ -145,7 +145,6 @@ typedef struct _TEB
/* scheduler/thread.c */
extern void THREAD_Init(void);
extern TEB *THREAD_InitStack( TEB *teb, DWORD stack_size );
/* scheduler/sysdeps.c */