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

Alexandre Julliard julliard at winehq.org
Fri Mar 26 16:03:30 CDT 2021


Module: wine
Branch: master
Commit: 482a26e13503a9779107d6e7f1bf9229b6cecea4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=482a26e13503a9779107d6e7f1bf9229b6cecea4

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Mar 26 11:34:36 2021 +0100

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

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/loader.c       | 47 +++++++++++++++++++++++++++++++++++-------
 dlls/ntdll/unix/process.c      | 39 ++---------------------------------
 dlls/ntdll/unix/unix_private.h |  1 +
 3 files changed, 43 insertions(+), 44 deletions(-)

diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 2467b640a79..f89ec12dc7e 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -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 */
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c
index d2fd08e155f..1a92235de20 100644
--- a/dlls/ntdll/unix/process.c
+++ b/dlls/ntdll/unix/process.c
@@ -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;
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 3f84fa9c065..904667399f2 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -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;




More information about the wine-cvs mailing list