Commit 7512c53b authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Cache the main image section information.

parent 5a8bc554
...@@ -1891,7 +1891,6 @@ static RTL_USER_PROCESS_PARAMETERS *build_initial_params(void) ...@@ -1891,7 +1891,6 @@ static RTL_USER_PROCESS_PARAMETERS *build_initial_params(void)
{ {
static const WCHAR pathW[] = {'P','A','T','H'}; static const WCHAR pathW[] = {'P','A','T','H'};
RTL_USER_PROCESS_PARAMETERS *params = NULL; RTL_USER_PROCESS_PARAMETERS *params = NULL;
SECTION_IMAGE_INFORMATION image_info;
SIZE_T size, env_pos, env_size; SIZE_T size, env_pos, env_size;
WCHAR *dst, *image, *cmdline, *p, *path = NULL; WCHAR *dst, *image, *cmdline, *p, *path = NULL;
WCHAR *env = get_initial_environment( &env_pos, &env_size ); WCHAR *env = get_initial_environment( &env_pos, &env_size );
...@@ -1916,11 +1915,11 @@ static RTL_USER_PROCESS_PARAMETERS *build_initial_params(void) ...@@ -1916,11 +1915,11 @@ static RTL_USER_PROCESS_PARAMETERS *build_initial_params(void)
add_registry_environment( &env, &env_pos, &env_size ); add_registry_environment( &env, &env_pos, &env_size );
env[env_pos++] = 0; env[env_pos++] = 0;
status = load_main_exe( NULL, main_argv[1], curdir, &image, &module, &image_info ); status = load_main_exe( NULL, main_argv[1], curdir, &image, &module );
if (!status) if (!status)
{ {
if (image_info.ImageCharacteristics & IMAGE_FILE_DLL) status = STATUS_INVALID_IMAGE_FORMAT; if (main_image_info.ImageCharacteristics & IMAGE_FILE_DLL) status = STATUS_INVALID_IMAGE_FORMAT;
if (image_info.Machine != current_machine) status = STATUS_INVALID_IMAGE_FORMAT; if (main_image_info.Machine != current_machine) status = STATUS_INVALID_IMAGE_FORMAT;
} }
if (status) /* try launching it through start.exe */ if (status) /* try launching it through start.exe */
...@@ -1928,7 +1927,7 @@ static RTL_USER_PROCESS_PARAMETERS *build_initial_params(void) ...@@ -1928,7 +1927,7 @@ static RTL_USER_PROCESS_PARAMETERS *build_initial_params(void)
static const char *args[] = { "start.exe", "/exec" }; static const char *args[] = { "start.exe", "/exec" };
free( image ); free( image );
if (module) NtUnmapViewOfSection( GetCurrentProcess(), module ); if (module) NtUnmapViewOfSection( GetCurrentProcess(), module );
load_start_exe( &image, &module, &image_info ); load_start_exe( &image, &module );
prepend_argv( args, 2 ); prepend_argv( args, 2 );
} }
else rebuild_argv(); else rebuild_argv();
...@@ -1989,7 +1988,6 @@ void init_startup_info(void) ...@@ -1989,7 +1988,6 @@ void init_startup_info(void)
NTSTATUS status; NTSTATUS status;
SIZE_T size, info_size, env_size, env_pos; SIZE_T size, info_size, env_size, env_pos;
RTL_USER_PROCESS_PARAMETERS *params = NULL; RTL_USER_PROCESS_PARAMETERS *params = NULL;
SECTION_IMAGE_INFORMATION image_info;
startup_info_t *info; startup_info_t *info;
if (!startup_info_size) if (!startup_info_size)
...@@ -2082,8 +2080,8 @@ void init_startup_info(void) ...@@ -2082,8 +2080,8 @@ void init_startup_info(void)
free( info ); free( info );
NtCurrentTeb()->Peb->ProcessParameters = params; NtCurrentTeb()->Peb->ProcessParameters = params;
status = load_main_exe( params->ImagePathName.Buffer, NULL, params->CommandLine.Buffer, status = load_main_exe( params->ImagePathName.Buffer, NULL,
&image, &module, &image_info ); params->CommandLine.Buffer, &image, &module );
if (status) if (status)
{ {
MESSAGE( "wine: failed to start %s\n", debugstr_us(&params->ImagePathName) ); MESSAGE( "wine: failed to start %s\n", debugstr_us(&params->ImagePathName) );
......
...@@ -122,6 +122,7 @@ const char *build_dir = NULL; ...@@ -122,6 +122,7 @@ const char *build_dir = NULL;
const char *config_dir = NULL; const char *config_dir = NULL;
const char **dll_paths = NULL; const char **dll_paths = NULL;
const char *user_name = NULL; const char *user_name = NULL;
SECTION_IMAGE_INFORMATION main_image_info = { NULL };
static HMODULE ntdll_module; static HMODULE ntdll_module;
static const IMAGE_EXPORT_DIRECTORY *ntdll_exports; static const IMAGE_EXPORT_DIRECTORY *ntdll_exports;
...@@ -1473,7 +1474,7 @@ static NTSTATUS open_main_image( WCHAR *image, void **module, SECTION_IMAGE_INFO ...@@ -1473,7 +1474,7 @@ static NTSTATUS open_main_image( WCHAR *image, void **module, SECTION_IMAGE_INFO
* load_main_exe * load_main_exe
*/ */
NTSTATUS load_main_exe( const WCHAR *dos_name, const char *unix_name, const WCHAR *curdir, NTSTATUS load_main_exe( const WCHAR *dos_name, const char *unix_name, const WCHAR *curdir,
WCHAR **image, void **module, SECTION_IMAGE_INFORMATION *image_info ) WCHAR **image, void **module )
{ {
UNICODE_STRING nt_name; UNICODE_STRING nt_name;
WCHAR *tmp = NULL; WCHAR *tmp = NULL;
...@@ -1487,7 +1488,7 @@ NTSTATUS load_main_exe( const WCHAR *dos_name, const char *unix_name, const WCHA ...@@ -1487,7 +1488,7 @@ NTSTATUS load_main_exe( const WCHAR *dos_name, const char *unix_name, const WCHA
if (unix_name && unix_name[0] == '/' && !stat( unix_name, &st )) if (unix_name && unix_name[0] == '/' && !stat( unix_name, &st ))
{ {
if ((status = unix_to_nt_file_name( unix_name, image ))) goto failed; if ((status = unix_to_nt_file_name( unix_name, image ))) goto failed;
status = open_main_image( *image, module, image_info ); status = open_main_image( *image, module, &main_image_info );
if (status != STATUS_DLL_NOT_FOUND) return status; if (status != STATUS_DLL_NOT_FOUND) return status;
free( *image ); free( *image );
} }
...@@ -1504,14 +1505,14 @@ NTSTATUS load_main_exe( const WCHAR *dos_name, const char *unix_name, const WCHA ...@@ -1504,14 +1505,14 @@ NTSTATUS load_main_exe( const WCHAR *dos_name, const char *unix_name, const WCHA
if ((status = get_full_path( dos_name, curdir, image ))) goto failed; if ((status = get_full_path( dos_name, curdir, image ))) goto failed;
free( tmp ); free( tmp );
status = open_main_image( *image, module, image_info ); status = open_main_image( *image, module, &main_image_info );
if (status != STATUS_DLL_NOT_FOUND) return status; if (status != STATUS_DLL_NOT_FOUND) return status;
/* if path is in system dir, we can load the builtin even if the file itself doesn't exist */ /* if path is in system dir, we can load the builtin even if the file itself doesn't exist */
init_unicode_string( &nt_name, *image ); init_unicode_string( &nt_name, *image );
if (is_builtin_path( &nt_name, &machine )) if (is_builtin_path( &nt_name, &machine ))
{ {
status = find_builtin_dll( &nt_name, module, &size, image_info, machine, FALSE ); status = find_builtin_dll( &nt_name, module, &size, &main_image_info, machine, FALSE );
if (status != STATUS_DLL_NOT_FOUND) return status; if (status != STATUS_DLL_NOT_FOUND) return status;
} }
if (!contains_path) return STATUS_DLL_NOT_FOUND; if (!contains_path) return STATUS_DLL_NOT_FOUND;
...@@ -1529,7 +1530,7 @@ failed: ...@@ -1529,7 +1530,7 @@ failed:
* *
* Load start.exe as main image. * Load start.exe as main image.
*/ */
NTSTATUS load_start_exe( WCHAR **image, void **module, SECTION_IMAGE_INFORMATION *image_info ) NTSTATUS load_start_exe( WCHAR **image, void **module )
{ {
static const WCHAR startW[] = {'\\','?','?','\\','C',':','\\','w','i','n','d','o','w','s','\\', static const WCHAR startW[] = {'\\','?','?','\\','C',':','\\','w','i','n','d','o','w','s','\\',
's','y','s','t','e','m','3','2','\\','s','t','a','r','t','.','e','x','e',0}; 's','y','s','t','e','m','3','2','\\','s','t','a','r','t','.','e','x','e',0};
...@@ -1538,7 +1539,7 @@ NTSTATUS load_start_exe( WCHAR **image, void **module, SECTION_IMAGE_INFORMATION ...@@ -1538,7 +1539,7 @@ NTSTATUS load_start_exe( WCHAR **image, void **module, SECTION_IMAGE_INFORMATION
SIZE_T size; SIZE_T size;
init_unicode_string( &nt_name, startW ); init_unicode_string( &nt_name, startW );
status = find_builtin_dll( &nt_name, module, &size, image_info, current_machine, FALSE ); status = find_builtin_dll( &nt_name, module, &size, &main_image_info, current_machine, FALSE );
if (status) if (status)
{ {
MESSAGE( "wine: failed to load start.exe: %x\n", status ); MESSAGE( "wine: failed to load start.exe: %x\n", status );
......
...@@ -1605,7 +1605,6 @@ size_t server_init_process(void) ...@@ -1605,7 +1605,6 @@ size_t server_init_process(void)
void server_init_process_done(void) void server_init_process_done(void)
{ {
PEB *peb = NtCurrentTeb()->Peb; PEB *peb = NtCurrentTeb()->Peb;
IMAGE_NT_HEADERS *nt = get_exe_nt_header();
void *entry; void *entry;
NTSTATUS status; NTSTATUS status;
int suspend, needs_close, unixdir; int suspend, needs_close, unixdir;
...@@ -1622,7 +1621,8 @@ void server_init_process_done(void) ...@@ -1622,7 +1621,8 @@ void server_init_process_done(void)
#ifdef __APPLE__ #ifdef __APPLE__
send_server_task_port(); send_server_task_port();
#endif #endif
if (nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) virtual_set_large_address_space(); if (main_image_info.ImageCharacteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE)
virtual_set_large_address_space();
/* Install signal handlers; this cannot be done earlier, since we cannot /* Install signal handlers; this cannot be done earlier, since we cannot
* send exceptions to the debugger before the create process event that * send exceptions to the debugger before the create process event that
......
...@@ -120,6 +120,7 @@ extern const char **dll_paths DECLSPEC_HIDDEN; ...@@ -120,6 +120,7 @@ extern const char **dll_paths DECLSPEC_HIDDEN;
extern USHORT *uctable DECLSPEC_HIDDEN; extern USHORT *uctable DECLSPEC_HIDDEN;
extern USHORT *lctable DECLSPEC_HIDDEN; extern USHORT *lctable DECLSPEC_HIDDEN;
extern SIZE_T startup_info_size DECLSPEC_HIDDEN; extern SIZE_T startup_info_size DECLSPEC_HIDDEN;
extern SECTION_IMAGE_INFORMATION main_image_info DECLSPEC_HIDDEN;
extern int main_argc DECLSPEC_HIDDEN; extern int main_argc DECLSPEC_HIDDEN;
extern char **main_argv DECLSPEC_HIDDEN; extern char **main_argv DECLSPEC_HIDDEN;
extern char **main_envp DECLSPEC_HIDDEN; extern char **main_envp DECLSPEC_HIDDEN;
...@@ -147,8 +148,8 @@ extern NTSTATUS load_builtin( const pe_image_info_t *image_info, WCHAR *filename ...@@ -147,8 +148,8 @@ extern NTSTATUS load_builtin( const pe_image_info_t *image_info, WCHAR *filename
void **addr_ptr, SIZE_T *size_ptr ) DECLSPEC_HIDDEN; void **addr_ptr, SIZE_T *size_ptr ) DECLSPEC_HIDDEN;
extern BOOL is_builtin_path( const UNICODE_STRING *path, WORD *machine ) DECLSPEC_HIDDEN; extern BOOL is_builtin_path( const UNICODE_STRING *path, WORD *machine ) DECLSPEC_HIDDEN;
extern NTSTATUS load_main_exe( const WCHAR *name, const char *unix_name, const WCHAR *curdir, WCHAR **image, extern NTSTATUS load_main_exe( const WCHAR *name, const char *unix_name, const WCHAR *curdir, WCHAR **image,
void **module, SECTION_IMAGE_INFORMATION *image_info ) DECLSPEC_HIDDEN; void **module ) DECLSPEC_HIDDEN;
extern NTSTATUS load_start_exe( WCHAR **image, void **module, SECTION_IMAGE_INFORMATION *image_info ) DECLSPEC_HIDDEN; extern NTSTATUS load_start_exe( WCHAR **image, void **module ) DECLSPEC_HIDDEN;
extern void start_server( BOOL debug ) DECLSPEC_HIDDEN; extern void start_server( BOOL debug ) DECLSPEC_HIDDEN;
extern ULONG_PTR get_image_address(void) DECLSPEC_HIDDEN; extern ULONG_PTR get_image_address(void) DECLSPEC_HIDDEN;
...@@ -295,12 +296,6 @@ static inline void ascii_to_unicode( WCHAR *dst, const char *src, size_t len ) ...@@ -295,12 +296,6 @@ static inline void ascii_to_unicode( WCHAR *dst, const char *src, size_t len )
while (len--) *dst++ = (unsigned char)*src++; while (len--) *dst++ = (unsigned char)*src++;
} }
static inline IMAGE_NT_HEADERS *get_exe_nt_header(void)
{
IMAGE_DOS_HEADER *module = (IMAGE_DOS_HEADER *)NtCurrentTeb()->Peb->ImageBaseAddress;
return (IMAGE_NT_HEADERS *)((char *)module + module->e_lfanew);
}
static inline void *get_signal_stack(void) static inline void *get_signal_stack(void)
{ {
return (char *)NtCurrentTeb() + teb_size - teb_offset; return (char *)NtCurrentTeb() + teb_size - teb_offset;
......
...@@ -3006,12 +3006,8 @@ NTSTATUS virtual_alloc_thread_stack( INITIAL_TEB *stack, SIZE_T reserve_size, SI ...@@ -3006,12 +3006,8 @@ NTSTATUS virtual_alloc_thread_stack( INITIAL_TEB *stack, SIZE_T reserve_size, SI
sigset_t sigset; sigset_t sigset;
SIZE_T size, extra_size = 0; SIZE_T size, extra_size = 0;
if (!reserve_size || !commit_size) if (!reserve_size) reserve_size = main_image_info.MaximumStackSize;
{ if (!commit_size) commit_size = main_image_info.CommittedStackSize;
IMAGE_NT_HEADERS *nt = get_exe_nt_header();
if (!reserve_size) reserve_size = nt->OptionalHeader.SizeOfStackReserve;
if (!commit_size) commit_size = nt->OptionalHeader.SizeOfStackCommit;
}
size = max( reserve_size, commit_size ); size = max( reserve_size, commit_size );
if (size < 1024 * 1024) size = 1024 * 1024; /* Xlib needs a large stack */ if (size < 1024 * 1024) size = 1024 * 1024; /* Xlib needs a large stack */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment