Moved the constructor for the initial TEB to ntdll so that it runs as
early as possible on startup.
This commit is contained in:
parent
36a6c740c4
commit
20e73d739a
|
@ -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 = ¤t_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 );
|
||||
|
|
|
@ -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 *)¤t_process; /* FIXME */
|
||||
SYSDEPS_SetCurThread( &initial_teb );
|
||||
}
|
||||
}
|
||||
|
||||
DECL_GLOBAL_CONSTRUCTOR(thread_init) { THREAD_Init(); }
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* THREAD_Start
|
||||
*
|
||||
|
|
|
@ -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 = ¶ms;
|
||||
peb.LdrData = &ldr;
|
||||
InitializeListHead( &ldr.InLoadOrderModuleList );
|
||||
InitializeListHead( &ldr.InMemoryOrderModuleList );
|
||||
InitializeListHead( &ldr.InInitializationOrderModuleList );
|
||||
|
||||
SYSDEPS_SetCurThread( &teb );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* NtOpenThread (NTDLL.@)
|
||||
* ZwOpenThread (NTDLL.@)
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue