Commit 482a26e1 authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Use the same builtin check for process creation and initial image loading.

parent 34652f37
......@@ -1452,6 +1452,42 @@ NTSTATUS load_builtin( const pe_image_info_t *image_info, const WCHAR *filename,
}
/***************************************************************************
* is_builtin_path
*/
BOOL is_builtin_path( const UNICODE_STRING *path, WORD *machine )
{
static const WCHAR wow64W[] = {'\\','?','?','\\','c',':','\\','w','i','n','d','o','w','s','\\',
's','y','s','w','o','w','6','4'};
unsigned int len;
*machine = current_machine;
if (path->Length > wcslen(system_dir) * sizeof(WCHAR) &&
!wcsnicmp( path->Buffer, system_dir, wcslen(system_dir) ))
{
#ifndef _WIN64
if (NtCurrentTeb64() && NtCurrentTeb64()->TlsSlots[WOW64_TLS_FILESYSREDIR])
*machine = IMAGE_FILE_MACHINE_AMD64;
#endif
goto found;
}
if ((is_win64 || is_wow64) && path->Length > sizeof(wow64W) &&
!wcsnicmp( path->Buffer, wow64W, ARRAY_SIZE(wow64W) ))
{
*machine = IMAGE_FILE_MACHINE_I386;
goto found;
}
return FALSE;
found:
/* check that there are no other path components */
len = wcslen(system_dir);
while (len < path->Length / sizeof(WCHAR) && path->Buffer[len] == '\\') len++;
while (len < path->Length / sizeof(WCHAR) && path->Buffer[len] != '\\') len++;
return len == path->Length / sizeof(WCHAR);
}
/***********************************************************************
* open_main_image
*/
......@@ -1507,7 +1543,7 @@ NTSTATUS load_main_exe( const WCHAR *name, const char *unix_name, const WCHAR *c
NTSTATUS status;
SIZE_T size;
struct stat st;
const WCHAR *p;
WORD machine;
/* special case for Unix file name */
if (unix_name && unix_name[0] == '/' && !stat( unix_name, &st ))
......@@ -1523,13 +1559,10 @@ NTSTATUS load_main_exe( const WCHAR *name, const char *unix_name, const WCHAR *c
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 (!wcsnicmp( *image, system_dir, wcslen(system_dir) ))
init_unicode_string( &nt_name, *image );
if (is_builtin_path( &nt_name, &machine ))
{
p = *image + wcslen( system_dir );
while (*p == '\\') p++;
if (wcschr( p, '\\' )) goto failed;
init_unicode_string( &nt_name, *image );
status = find_builtin_dll( &nt_name, module, &size, image_info, current_machine, FALSE );
status = find_builtin_dll( &nt_name, module, &size, image_info, machine, FALSE );
if (status != STATUS_DLL_NOT_FOUND) return status;
}
/* if name contains a path, bail out */
......
......@@ -226,33 +226,6 @@ static startup_info_t *create_startup_info( const RTL_USER_PROCESS_PARAMETERS *p
}
/***************************************************************************
* is_builtin_path
*/
static BOOL is_builtin_path( UNICODE_STRING *path, BOOL *is_64bit )
{
static const WCHAR wow64W[] = {'\\','?','?','\\','c',':','\\','w','i','n','d','o','w','s','\\',
's','y','s','w','o','w','6','4'};
*is_64bit = is_win64;
if (path->Length > wcslen(system_dir) * sizeof(WCHAR) &&
!wcsnicmp( path->Buffer, system_dir, wcslen(system_dir) ))
{
#ifndef _WIN64
if (NtCurrentTeb64() && NtCurrentTeb64()->TlsSlots[WOW64_TLS_FILESYSREDIR]) *is_64bit = TRUE;
#endif
return TRUE;
}
if ((is_win64 || is_wow64) && path->Length > sizeof(wow64W) &&
!wcsnicmp( path->Buffer, wow64W, ARRAY_SIZE(wow64W) ))
{
*is_64bit = FALSE;
return TRUE;
}
return FALSE;
}
/***********************************************************************
* get_so_file_info
*/
......@@ -373,17 +346,9 @@ static NTSTATUS get_pe_file_info( UNICODE_STRING *path, HANDLE *handle, pe_image
if ((status = NtOpenFile( handle, GENERIC_READ, &attr, &io,
FILE_SHARE_READ | FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT )))
{
BOOL is_64bit;
if (is_builtin_path( path, &is_64bit ))
if (is_builtin_path( path, &info->machine ))
{
TRACE( "assuming %u-bit builtin for %s\n", is_64bit ? 64 : 32, debugstr_us(path));
/* assume current arch */
#if defined(__i386__) || defined(__x86_64__)
info->machine = is_64bit ? IMAGE_FILE_MACHINE_AMD64 : IMAGE_FILE_MACHINE_I386;
#else
info->machine = current_machine;
#endif
TRACE( "assuming %04x builtin for %s\n", info->machine, debugstr_us(path));
return STATUS_SUCCESS;
}
return status;
......
......@@ -143,6 +143,7 @@ extern char **build_envp( const WCHAR *envW ) DECLSPEC_HIDDEN;
extern NTSTATUS exec_wineloader( char **argv, int socketfd, const pe_image_info_t *pe_info ) DECLSPEC_HIDDEN;
extern NTSTATUS load_builtin( const pe_image_info_t *image_info, const WCHAR *filename,
void **addr_ptr, SIZE_T *size_ptr ) 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,
void **module, SECTION_IMAGE_INFORMATION *image_info ) DECLSPEC_HIDDEN;
extern NTSTATUS load_start_exe( WCHAR **image, void **module, SECTION_IMAGE_INFORMATION *image_info ) DECLSPEC_HIDDEN;
......
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